जादू की संख्या को बढ़ावा देने में :: hash_combine


94

boost::hash_combineटेम्पलेट समारोह हैश (कहा जाता है के लिए एक संदर्भ लेता है seed) और एक वस्तु v। डॉक्स के अनुसार , यह seedके हैश के साथ जोड़ती vहै

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

मैं देख सकता हूं कि यह निर्धारक है। मैं देखता हूं कि XOR का उपयोग क्यों किया जाता है।

मुझे यकीन है कि इसके अलावा समान मूल्यों को व्यापक रूप से मैप करने में मदद मिलती है, इसलिए प्रोबिंग हैश टेबल टूट नहीं जाएगी, लेकिन क्या कोई यह बता सकता है कि जादू स्थिरांक क्या है?


यह देखते हुए कि कई कंप्यूटरों पर एक पूर्णांक लागत के रूप में एक पारी के रूप में एक ही बारी बारी से अभिव्यक्ति को परिवर्तित करने में कोई लाभ होगा: <code> seed ^ = hash_value (v) + 0x9e3779b9 + रोटल (बीज, 6) + रोट्र (बीज) 2); </ code>
— जॉन येट्स

जवाबों:


140

जादू की संख्या 32 यादृच्छिक बिट्स माना जाता है, जहां प्रत्येक समान रूप से 0 या 1 होने की संभावना है, और बिट्स के बीच कोई सरल संबंध नहीं है। इस तरह के बिट्स की एक स्ट्रिंग को खोजने का एक सामान्य तरीका एक अपरिमेय संख्या के द्विआधारी विस्तार का उपयोग करना है; इस मामले में, वह संख्या स्वर्ण अनुपात का पारस्परिक है:

phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9

तो इस संख्या सहित "बेतरतीब ढंग से" बीज के प्रत्येक बिट को बदलता है; जैसा कि आप कहते हैं, इसका मतलब है कि लगातार मूल्य दूर होंगे। पुराने बीज के शिफ्ट किए गए संस्करणों को शामिल करना सुनिश्चित करता है कि, भले ही hash_value()मूल्यों की एक छोटी सी सीमा हो, मतभेद जल्द ही सभी बिट्स में फैल जाएंगे।


14
ठंडा! मुझे यह पसंद है जब संख्या सिद्धांत अचानक उपयोगी हो जाता है :)
— फ्रेड फू

8
@ लार्समैन मुझे आपके 'अचानक' के उपयोग से प्यार है - यह बहुत उपयुक्त है! संख्या सिद्धांत "हाँ, यह अच्छा है ... जैसा है, लेकिन मुझे असली काम मिला है, क्षमा करें" सभी मामलों में 99%। और फिर, जैसा कि आप कहते हैं, 'अचानक', संख्या सिद्धांत सुपर सुपर उपयोगी है। यह एक हथौड़ा जहां यह है की तरह नहीं है बल्कि बातें की एक बड़ी संख्या के लिए उपयोगी। इसके बजाय, यह एक स्केलपेल की तरह है जो बहुत कम चीजों के लिए बेहद उपयोगी है।
— corsiKa

5
@SamKellett चाहेंगे काम और भी बेहतर अगर आप कोष्ठकों की सही संख्या का इस्तेमाल किया और मिल गया0x9e3779b97f4a7800
— बैरी

5
क्योंकि पायथन के फ्लोटिंग पॉइंट नंबर में पर्याप्त सटीकता नहीं है, इसलिए ऊपर 64-बिट गोल्डन अनुपात सही नहीं हैं। वास्तविक परिणाम होना चाहिए 0x9e3779b97f4a7c15।
— kennytm 15

1
@kennytm क्या आपका मतलब यह नहीं है 0x9e3779b97f4a7c16? मेरा मतलब है, यह केवल 1 बंद है।
— bit2shift 5

25

1997 से बॉब जेनकिंस के डीडीजे लेख पर एक नज़र डालें । जादू स्थिरांक ("स्वर्ण अनुपात") को इस प्रकार समझाया गया है:

सुनहरा अनुपात वास्तव में एक मनमाना मूल्य है। इसका उद्देश्य सभी शून्य को सभी शून्य से मैप करने से बचना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.