दिलचस्प पोस्ट
एक पृष्ठभूमि स्क्रिप्ट से सामग्री स्क्रिप्ट तक संदेश भेजना, फिर इंजेक्शन वाली स्क्रिप्ट के लिए 'COLLATE SQL_Latin1_General_CP1_CI_AS' क्या करता है? PHP में एक सरणी से 'कॉलम' को निकालने के लिए कोई फ़ंक्शन है? जनरेटर उत्पादन की लंबाई PHP स्क्रिप्ट में एक एसक्यूएल क्वेरी का निर्माण कैसे करें? ग्रेडल बिल्ड.ग्रॅडल टू मेवेन पॉम.एक्सएमएल कैसे एक सी समारोह में स्विफ्ट तार की एक सरणी को पार करने के लिए एक char ** पैरामीटर ले एंड्रॉइड: बटन पर क्लिक करने पर विकल्प मेनू आइटम सक्षम / निष्क्रिय कैसे करें? AngularJS: एनजी मॉडल बाध्यकारी अद्यतन नहीं है जब jQuery के साथ बदल दिया JQuery के साथ उपयोग के लिए जेएस अर्रे () जेसन ऑब्जेक्ट को कन्वर्ट करें रूबी में मैं अस्थायी रूप से stderr पुनर्निर्देशित कैसे करूं? PHP में यूआरएल से एक ही नाम के साथ एक से अधिक पैरामीटर कैसे प्राप्त करें आप फेसबुक पेज पर दीवार पर कैसे पोस्ट करते हैं (प्रोफ़ाइल नहीं) क्यों BitmapFactory.decodeByteArray रिक्त वापसी करता है? मैं विशिष्ट वर्ग लोडर में लोड किए गए सभी कक्षाओं को कैसे सूचीबद्ध कर सकता हूं

32 बिट पूर्णांक के साथ कम टक्कर दर के साथ फास्ट स्ट्रिंग हैशिंग एल्गोरिथम

मेरे पास बहुत से असंबंधित नामित चीजें हैं जिनके खिलाफ मैं शीघ्र खोज करना चाहता हूं एक "आर्डवार्क" हर जगह हमेशा एक "आर्डवार्क" होता है, इसलिए स्ट्रिंग को हंसिंग करना और पूर्णांक का पुन: उपयोग करना समानताएं बढ़ाने के लिए अच्छी तरह से काम करेगा नामों का पूरा सेट अज्ञात है (और समय के साथ परिवर्तन)। एक तेज स्ट्रिंग हैशिंग एल्गोरिथ्म क्या है जो छोटे (32 या 16) बिट मान उत्पन्न करेगा और कम टक्कर दर होगी?

मैं सी / सी ++ के लिए एक अनुकूलित कार्यान्वयन देखना चाहता हूं

वेब के समाधान से एकत्रित समाधान "32 बिट पूर्णांक के साथ कम टक्कर दर के साथ फास्ट स्ट्रिंग हैशिंग एल्गोरिथम"

एफएनवी के एक संस्करण में आपकी आवश्यकताओं को पूरा करना चाहिए। वे तेज़ हैं, और काफी समान रूप से वितरित आउटपुट का उत्पादन करते हैं।

मुंहुर हैश बहुत अच्छा है

किसी निश्चित स्ट्रिंग सेट के लिए gperf का उपयोग करें

यदि आपके स्ट्रिंग-सेट में बदलाव होता है तो आपको एक हैश फ़ंक्शन चुनना पड़ता है। उस विषय पर पहले चर्चा की गई है:

हैश_मैप का उपयोग करते समय एक स्टेल स्ट्रिंग पर उपयोग करने के लिए सबसे अच्छा हैशिंग एल्गोरिथ्म क्या है?

सदाबहार पर एक अच्छा लेख भी है। Confused.com

जेनकिंस 'वन-ए-एक-टाइम हैश स्ट्रिंग्स के लिए कुछ ऐसा दिखना चाहिए:

#include <stdint.h> uint32_t hash_string(const char * s) { uint32_t hash = 0; for(; *s; ++s) { hash += *s; hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash; } 

आपके उपयोग-केस के आधार पर एक और समाधान जो अधिक बेहतर हो सकता है, तारों को बंद कर दिया जाता है । यह कैसे प्रतीक काम करता है उदाहरण के लिस्प में।

एक आंतरिक स्ट्रिंग एक स्ट्रिंग वस्तु है जिसका मान वास्तविक स्ट्रिंग बाइट का पता है। तो आप एक वैश्विक तालिका में चेक करके एक आंतरिक स्ट्रिंग ऑब्जेक्ट बनाते हैं: यदि स्ट्रिंग वहां है, तो आप उस स्ट्रिंग के पते पर आंतरिक स्ट्रिंग को इनिशियलाइज़ कर सकते हैं। यदि नहीं, तो आप इसे डालें, और फिर अपने आंतरिक स्ट्रिंग को इनिशियलाइज़ करें।

इसका अर्थ है कि एक ही स्ट्रिंग से बनाए गए दो आंतरिक स्ट्रिंग्स का समान मूल्य होगा, जो एक पता है। इसलिए यदि एन आपके सिस्टम में आंतरिक स्ट्रिंग की संख्या है, तो विशेषताओं हैं:

  • धीमे निर्माण (लुकअप की आवश्यकता है और शायद मेमोरी आवंटन)
  • समवर्ती धागे के मामले में वैश्विक डेटा और सिंक्रनाइज़ेशन की आवश्यकता होती है
  • तुलना ओ (1) है, क्योंकि आप पते की तुलना कर रहे हैं, वास्तविक स्ट्रिंग बाइट्स नहीं (इसका मतलब है कि सॉर्टिंग अच्छी तरह से काम करती है, लेकिन यह एक वर्णमाला प्रकार नहीं होगा)।

चीयर्स,

कार्ल

आप बूस्ट पुस्तकालयों का उपयोग क्यों नहीं करते हैं? उनके हैशिंग फ़ंक्शन का उपयोग करना सरल है और बूस्ट में अधिकांश सामान जल्द ही C ++ मानक का हिस्सा होगा उनमें से कुछ पहले से ही है

बूस्ट को बढ़ावा देना आसान है

 #include <boost/functional/hash.hpp> int main() { boost::hash<std::string> string_hash; std::size_t h = string_hash("Hash me"); } 

Boost.org पर आपको बढ़ावा मिलेगा

GNU gperf को देखें

Hsieh हैश समारोह बहुत अच्छा है, और कुछ मानक / तुलना हैं, सी में एक सामान्य हैश समारोह के रूप में। जो आप चाहते हैं (यह पूरी तरह से स्पष्ट नहीं है) के आधार पर आप सीडीबी की तरह कुछ पर विचार करना चाह सकते हैं

बॉब जेनकींस में कई हैश फ़ंक्शन उपलब्ध हैं , जो सभी तेज हैं और कम टक्कर दर हैं

यह एक अच्छा विषय के लिए कभी देर नहीं होता और मुझे यकीन है कि लोगों को मेरे निष्कर्षों पर दिलचस्पी होगी।

मुझे एक हैश फ़ंक्शन की आवश्यकता है और इस पोस्ट को पढ़ने के बाद और यहां दी गई लिंक्स पर कुछ शोध करने के बाद, मैं डैनियल जे बर्नस्टेन के एल्गोरिदम के इस बदलाव के साथ आया था, जो मैंने एक दिलचस्प परीक्षण किया था:

 unsigned long djb_hashl(const char *clave) { unsigned long c,i,h; for(i=h=0;clave[i];i++) { c = toupper(clave[i]); h = ((h << 5) + h) ^ c; } return h; } 

यह भिन्नता केस को अनदेखा करने के लिए स्ट्रिंग्स को हद कर देती है, जो उपयोगकर्ता के प्रवेश प्रमाण पत्र की आवश्यकता के अनुरूप है। 'क्लेव' स्पैनिश में 'कुंजी' है मुझे स्पेनिश के लिए खेद है लेकिन इसकी मातृभाषा है और कार्यक्रम इस पर लिखा है।

खैर, मैंने एक प्रोग्राम लिखा था जो 'test_aaaa' से 'test_zzzz' के लिए उपयोगकर्ता नाम उत्पन्न करेगा, और स्ट्रिंग्स को लंबे समय तक बनाने के लिए- मैंने उन्हें इस सूची में एक यादृच्छिक डोमेन जोड़ा: 'cloud-nueve.com', 'yahoo.com ',' gmail.com 'और' hotmail.com '। इसलिए उनमें से प्रत्येक ऐसा दिखेगा:


 test_aaaa@cloud-nueve.com, test_aaab@yahoo.com, 
 test_aaac@gmail.com, test_aaad@hotmail.com और इसी तरह।

यहां टेस्ट का उत्पादन है- 'क्लीजन एंट्री XXX यू XXX' का अर्थ 'XXX और XXX की टक्कर' है 'पलबर्स' का मतलब है 'शब्द' और 'कुल' दोनों भाषाओं में समान है-


     बुसांडो कॉलिनेस ...
     कॉलिशन एंटर 'test_phiz@hotmail.com' y 'test_juxg@cloud-nueve.com' (1 डीबी 903 बी 7)
     कोलीजन एंटर 'test_rfhh@hotmail.com' y 'test_fpgo@yahoo.com' (2F5BC088)
     कोलीजन एंटर 'test_wxuj@hotmail.com' y 'test_pugy@cloud-nueve.com' (51 एफडी 0 9 सीसी)
     कॉलिशन में प्रवेश 'test_sctb@gmail.com' y 'test_iohw@cloud-nueve.com' (52F5480 ई)
     कॉलिशन में प्रवेश 'test_wpgu@cloud-nueve.com' y 'test_seik@yahoo.com' (74FF72E2)
     कोलीजन एंटर 'test_rfll@hotmail.com' y 'test_btgo@yahoo.com' (7FD70008)
     कॉलिशन एंटर 'test_wcho@cloud-nueve.com' y 'test_scfz@gmail.com' (9 बीडी 351 सी 4)
     कॉलिशन एंटर 'test_swky@cloud-nueve.com' y 'test_fqpn@gmail.com' (ए 86 ​​9 3 ई 1)
     कोलीजन एंटर 'test_rftd@hotmail.com' y 'test_jlgo@yahoo.com' (बीए 6 बी 0718)
     कोलीजन एंटर 'test_rfpp@hotmail.com' y 'test_nxgo@yahoo.com' (D0523F88)
     कोलिजन प्रवेश 'test_zlgo@yahoo.com' y 'test_rfdd@hotmail.com' (DEE08108)
     कुल डे कॉलिन्स: 11
     कुल डी पलाब्रास: 45 9 776

यह बुरा नहीं है, 456 9 76 में 11 टक्करें (पूरी तरह से 32 बिट को टेबल लैंग के रूप में उपयोग कर रही है)।

प्रोग्राम को 5 वर्णों का प्रयोग करते हुए, जो कि 'test_aaaaa' से 'test_zzzzz' है, वास्तव में मेमरी बनाने से तालिका समाप्त हो जाती है। नीचे आउटपुट है 'कोई गड़गड़ाहट नहीं करने के लिए XXXX (inserted XXX)' का मतलब है 'वहाँ XXX (XXX डाला) सम्मिलित करने के लिए छोड़ दिया स्मृति नहीं है'। असल में malloc () उस बिंदु पर विफल रहे।


     कोई पारा मेमोरी पैरा सम्मिलित 'test_epjcv' (सम्मिलित 2097701)

     बुसांडो कॉलिसेज ...

     ... 451 'colision' तार ...

     कुल डे कॉलिन्स: 451
     कुल डी पलाब्रास: 20 9 7701

जिसका अर्थ है 2,097,701 स्ट्रिंग्स पर सिर्फ 451 टकराव ध्यान दें कि अवसरों में से कोई भी नहीं, प्रति कोड 2 से अधिक टक्करें थीं जो मैं पुष्टि करता हूं कि यह मेरे लिए एक महान हैश है, क्योंकि मुझे इसकी आवश्यकता है कि लॉगिन आईडी को अनुक्रमण के लिए 40 बिट अद्वितीय आईडी में कनवर्ट करना है। इसलिए मैं इसका उपयोग लॉगिन क्रेडेंशियल्स को 32 बिट हैश में बदलने के लिए और अतिरिक्त 8 बिट्स का उपयोग करने के लिए प्रति कोड 255 टक्कर तक करने के लिए करता हूं, जो कि परीक्षण के परिणामों पर गौर करने के लिए लगभग असंभव होगा

आशा है कि यह किसी के लिए उपयोगी है

संपादित करें:

परीक्षा बॉक्स की तरह AIX, मैं इसे LDR_CNTRL = MAXDATA = 0x20000000 का उपयोग करके इसे और अधिक स्मृति देने के लिए चलाता हूं और यह अधिक समय चला, परिणाम यहां हैं:

बसकांदो कोलिज़ीस … कुल को कॉलिज़ेन्स: 2908 कुल डी पलाब्रास: 5366384

5,366,384 के बाद यह 2908 है!

बहुत महत्वपूर्ण : प्रोग्राम के साथ- maix64 संकलन (इतना अहस्ताक्षरित लंबे 64 बिट है), सभी मामलों के लिए टक्कर 0 की संख्या है !!!

आप देख सकते हैं कि एनआईटी ने स्ट्रिंग.गेटहाशकोड () विधि पर परावर्तन का उपयोग करते हुए देखा है।

मुझे लगता है कि माइक्रोसॉफ्ट इस समय का अनुकूलन करने के लिए काफी समय लगा। उन्होंने सभी एमएसडीएन दस्तावेजों में भी मुद्रित किया है कि यह हर समय परिवर्तन के अधीन है। तो स्पष्ट रूप से यह उनके "प्रदर्शन tweaking रडार" पर है 😉

सी + + के लिए बंदरगाह के लिए बहुत तुच्छ होगा मैं भी सोचा होगा

इस पिछले प्रश्न में कुछ अच्छी चर्चा है

और हैश फ़ंक्शन का चयन करने के साथ-साथ कई सामान्य लोगों के वितरण के आंकड़ों के बारे में एक अच्छी अवलोकन

यहां वर्णित यह स्वयं को लागू करने का एक आसान तरीका है: http://www.devcodenote.com/2015/04/collision-free-string-hashing.html

पोस्ट से एक स्निपेट:

अगर कहें कि हमारे पास पूंजी अंग्रेज़ी अक्षरों का एक चरित्र सेट है, तो चरित्र सेट की लंबाई 26 है जहां A को संख्या 0, बी को नंबर 1, सी 2 और संख्या से 2 और इसी तरह से संख्या के आधार पर दर्शाया जा सकता है। 25. अब, जब भी हम इस वर्ण की एक स्ट्रिंग को एक अनन्य संख्या में सेट करना चाहते हैं, हम एक ही रूपांतरण करते हैं जैसे हमने बाइनरी प्रारूप के मामले में किया था

सीआरसी -32 इसके लिए गूगल पर ट्रिलियन लिंक के बारे में है