2011-08-10 13 views
12

मैं इस की तर्ज पर कुछ के साथ .net स्रोत कल से कुछ के माध्यम से देख रहा था और देखा GetHashcode के कई कार्यान्वयन:नेट GetHashcode बिट स्थानांतरण ऑपरेशन

(i1 << 5) + i^i2 

मैं समझता हूँ कि क्या कोड कर रहे हैं और क्यों कर रहा है । मैं क्या जानना चाहता हूं कि उन्होंने क्यों उपयोग किया (i1 < < 5) + मैं इसके बजाय (i1 < < 5) - i।

अधिकांश ढांचे का उपयोग मैंने देखा है- क्योंकि यह 31 तक गुणा करने के बराबर है जो कि प्रमुख है, लेकिन माइक्रोसॉफ्ट तरीका 33 से गुणा करने के बराबर है जिसमें 11 और 3 कारक हैं और इस प्रकार यह प्रमुख नहीं है।

क्या इसके लिए कोई ज्ञात औचित्य है? कोई उचित परिकल्पना?

+1

ठीक है, मुझे पता चला कि माइक्रोसॉफ्ट 33 का उपयोग क्यों करता है। इसे बर्नस्टीन हैश कहा जाता है। यह पता चला है कि 33 में कुछ जादुई गुण हैं जो हैश कोड का अच्छा वितरण करते हैं और क्यों बहुत कम सैद्धांतिक ज्ञान है। –

उत्तर

3

मैंने math.stackexchange.com पर उसी प्रश्न से पूछा: Curious Properties of 33

गणितज्ञों और अनुसंधान मैं विषय पर किया था के बीच में अनुमान मुझे विश्वास है कि इस सवाल का जवाब यह है:

ठीक है, मुझे पता चला क्यों माइक्रोसॉफ्ट 33. बर्नस्टीन हैश कहा जाता है यही कारण है कि उपयोग करता है। यह पता चला है कि 33 में कुछ जादुई गुण हैं जो हैश कोड के अच्छे वितरण का उत्पादन करते हैं और क्यों बहुत कम सैद्धांतिक ज्ञान है।

असल में, एन्ट्रॉपी और गति तुलना में, बर्नस्टीन काफी अच्छा करता है और काफी अस्पष्ट है। डेन बर्नस्टीन, जो व्यक्ति लगातार 33 के साथ आया था, यह समझाने में सक्षम नहीं था कि 33 की संपत्ति ने हशों का इतना अच्छा वितरण किया था।

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

0

मुझे याद नहीं है कि 31 उन प्राइम्स में से एक है, लेकिन कुछ प्राइम हैं जो Dictionary<K,V> द्वारा क्षमताओं के रूप में उपयोग किए जाते हैं। और यदि आप बाएं क्षेत्र का उपयोग करते हैं तो अब चयनित बाल्टी को प्रभावित नहीं करता है और हैश खराब हो जाता है।

+0

31 बाल्टी गणनाओं के लिए प्राइम्स सूची में दिखाई नहीं दे रहा है (सिस्टम.कोलेक्शन.शैशहेल्पर्स.प्रिम्स को देखकर), लेकिन यह मेरा पहला सवाल नहीं था। मेरा सवाल यह है कि माइक्रोसॉफ्ट 31 के बजाय 33 से गुणा क्यों कर रहा है? अन्य ढांचे को मैंने 31. 33 से गुणा किया है, यहां तक ​​कि प्रधान भी नहीं है। –

+0

यदि 31 उस सूची में दिखाई दिया तो यह समझाएगा कि क्यों एमएस गुणक के रूप में 31 का उपयोग नहीं करता है। लेकिन प्रधान होने के नाते वैसे भी महत्वपूर्ण नहीं है। – CodesInChaos

संबंधित मुद्दे