2011-07-26 14 views
9

मेरे पास एक अपरिवर्तनीय वर्ग है जिसका एकमात्र क्षेत्र bool[] (रनटाइम पर निर्धारित आकार) है।बूलियन से GetHashCode() केवल

मैं इस कक्षा के अच्छे हैश कोड की गणना कैसे कर सकता हूं? आम तौर पर मैं बस हर मैदान पर GetHashCode() कहेंगे, और उन्हें इन ऑपरेटरों में से एक के साथ गठबंधन: + | &, लेकिन जब से ही संभव हैश कोड false और 1true के लिए के लिए 0 कर रहे हैं, कि वास्तव में मुझे कहीं भी प्राप्त करने के लिए नहीं जा रहा है। मेरे कार्यान्वयन को केवल bools के साथ काम करने की आवश्यकता है, और इसे मनमानी आकार के सरणी के लिए काम करना चाहिए।

(शायद नहीं ज्यादा बात है, लेकिन मैं में सी #/कोडिंग करता हूँ नेट।।)

+0

क्या आपने 'बिटरायर 'माना है या आकार' बिटवॉक्टर 32' के आधार पर माना है? इसके लिए 'गेटहाशकोड' और जैसे कम कार्यान्वयन की आवश्यकता होगी। – Sebastian

उत्तर

8

मानते हुए अपने bool[]bools नाम है:

unchecked { 
    int hash = 17; 
    for(int index = 0; index < bools.Length; index++) { 
     hash = hash * 23 + bools[index].GetHashCode(); 
    } 
    return hash; 
} 
+1

क्या आप जेसन को नंबरों की व्याख्या कर सकते हैं? 17 और 23 कहां से आए थे? :-) –

+0

@ जैमी डिक्सन: यह एक मानक कार्यान्वयन है; मुख्य बिंदु यह है कि गुणक एक प्रमुख है। मुझे लगता है कि जावा का 'स्ट्रिंग .getHashCode' कुछ बहुत समान है। – jason

+0

यह काम नहीं करेगा, अलग-अलग स्थितियों में समान तत्वों वाले सरणी उसी हैशकोड – mcabral

0

सरल bools.GetHashCode() ठीक काम करता है जब तक आप चिंतित हैं प्रदर्शन के बारे में (इस मामले में जेसन के समाधान का उपयोग करें)।

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