2010-05-22 16 views
9

संभव डुप्लिकेट:
What is the best algorithm for an overridden System.Object.GetHashCode?कार्यान्वयन GetHashCode

क्या GetHashCode विधि का एक अच्छा कार्यान्वयन का गठन किया? मैंने कुछ googling किया, और कुछ goodlines (एमएसडीएन) पाया लेकिन यह तर्क की तरह लगता है कि कक्षा में खेतों के रूप में संग्रहीत दो संख्याओं में सिर्फ manipulates। क्या इस तर्क को लागू करने के लिए वास्तविक तर्क वास्तविक है?

उत्तर

34

न्यूनतम आवश्यकता यह है कि हैश कोड किसी दिए गए मान के लिए समान होना चाहिए। तो, यह कार्यान्वयन काम करता है, लेकिन वितरण भयानक है:

public override int GetHashCode() { 
    return 1; 
} 

सबसे अच्छा काम करने के लिए, हैश कोड वस्तु में सभी प्रासंगिक डेटा पर विचार करना चाहिए और के रूप में समान रूप से पूर्णांक सीमा के भीतर संभव के रूप में वितरित किया जा।

एक कार्यान्वयन जो सभी सदस्यों पर विचार करता है, लेकिन सिस्टम में बहुत अच्छा वितरण नहीं देता है। ड्रॉइंग.पॉइंट संरचना। है

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

एक तरह से एक बेहतर वितरण प्राप्त करने के लिए एक प्रमुख द्वारा एक सदस्य गुणा करने के लिए: यह सदस्यों में बिट्स गठबंधन करने के लिए, जिसका अर्थ है सभी बिंदुओं जहां एक्स और वाई के बराबर हैं हैश कोड शून्य मिलता है कि XOR का उपयोग करता है संख्या और अगले सदस्य जोड़ने के लिए, के रूप में की जरूरत दोहरा:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

एक ही विधि, सरल यादृच्छिक जनरेटर में इस्तेमाल किया गया है के रूप में यह मान बहुत अच्छी तरह से फैला देता है।

+0

कुछ वाकई अच्छे अंक हैं। धन्यवाद! – dotnetdev

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