दिलचस्प पोस्ट
LINQ के साथ पुनरावर्ती नियंत्रण खोज मैं किसी अन्य सरणी के सॉर्ट किए गए ऑर्डर के आधार पर एक से अधिक सरणी कैसे सॉर्ट कर सकता हूँ PrimeFaces के साथ jQuery और jQuery प्लगिन का उपयोग कैसे करें मैं जावास्क्रिप्ट में 2 फ़ंक्शन की तुलना कैसे करूं? दो या अधिक सूचियों पर एक बार फिर दोबारा करने का बेहतर तरीका उद्देश्य सी ++ क्या है? PostgreSQL: एक्सेल / सीएसवी से एसक्यूएल क्वेरी से निर्यात परिणाम डेटा एएसपी.नेट एमवीसी में पथ को कैसे लॉक करना है? किसी पाठ फ़ाइल से लाइन को संशोधित करना या हटाना निम्न स्तर का तरीका है? पिवट / अनिव्वॉट (डाली / पिघल) डेटा फ्रेम कैसे करें? चेतावनी: समारोह का अंतर्निहित घोषणा जावा आर एकीकरण? कैसे जांच करें कि उपयोगकर्ता ब्राउज़र इतिहास में वापस जा सकता है या नहीं Google Play स्टोर को क्रॉल करना एक कस्टम क्लास सूची को व्यवस्थित करें <T>

ऑर्डर के संबंध में फू ऑब्जेक्ट्स की सूची के लिए GetHashCode () अच्छा ओवरराइड

EnumerableObject : IEnumerable<Foo>

एक List<Foo> लपेटता है

अगर EnumerableObject a.SequenceEquals( EnumerableObject b) , तो वे समान हैं।

इसलिए, एक GetHashCode कार्यान्वित किया जाना चाहिए। समस्या यह है कि सूची में प्रत्येक तत्व को एक्सओरांग करना किसी भी सूची के लिए सभी है और केवल एक ही तत्व के लिए एक ही हैश कोड वापस करेगा, आदेश की परवाह किए बिना। यह काम करने के मामले में ठीक है, लेकिन कई टकरावों का परिणाम होगा, जो पुनर्प्राप्ति को धीमा कर देगा आदि।

GetHashCode सूची के लिए एक अच्छा, फास्ट GetHashCode विधि क्या है जो ऑर्डर आश्रित है?

Solutions Collecting From Web of "ऑर्डर के संबंध में फू ऑब्जेक्ट्स की सूची के लिए GetHashCode () अच्छा ओवरराइड"

मैं इसे उसी तरह से करूँगा जिसे मैं आमतौर पर हैश कोड को जोड़ता हूं – एक अतिरिक्त और गुणा के साथ:

 public override int GetHashCode() { unchecked { int hash = 19; foreach (var foo in foos) { hash = hash * 31 + foo.GetHashCode(); } return hash; } } 

(ध्यान दें कि आपको सूची में कुछ भी नहीं जोड़ना चाहिए, इसके बाद किसी भी विवरण के हैश तालिका में कुंजी के लिए उपयोग किया गया है, जैसा कि हैश बदल जाएगा। यह भी मानता है कि कोई रिक्त प्रविष्टियां नहीं हैं – यदि हो सकता है, तो आप उस के खाते को लेने की जरूरत है।)

सबसे पहले, दो बार जांच लें कि आपको हश कोड की ज़रूरत है। क्या आप इन सूचियों को एक हैश-मैप किए गए संरचना (उदाहरण के लिए, हैशसेट, आदि) में डालने जा रहे हैं? यदि नहीं, तो इसके बारे में भूल जाओ

अब, यह मानते हुए कि आप का मतलब है कि एन्युमेरेबलऑब्जेक्ट पहले से ही Equals(object) ओवरराइड कर IEquatable<EnumerableObject> (और उम्मीद है इसलिए IEquatable<EnumerableObject> Equals(object) IEquatable<EnumerableObject> ) किसी कारण से लागू करता है, तो यह वास्तव में आवश्यक है आप गति बनाम बिट वितरण को संतुलित करना चाहते हैं।

एक अच्छा प्रारंभिक बिंदु एक बहु + जोड़ या एक बदलाव है: जैसे:

 public override int GetHashCode() { int res = 0x2D2816FE; foreach(var item in this) { res = res * 31 + (item == null ? 0 : item.GetHashCode()); } return res; } 

(यह मानता है कि आप आइटम का प्रयोग कर रहे हैं। एक्सेल () अपने अनुक्रम समानता तुलना के लिए, यदि आप एक IEqualityComparer के बराबर का उपयोग कर रहे हैं तो आपको अपने हैशोड में कॉल करना होगा)।

वहां से हम अनुकूलित कर सकते हैं

यदि रिक्त वस्तुओं को अस्वीकार कर दिया गया है, तो निरर्थक जांच को हटा दें (सावधान रहें, यह कोड को थ्रो देगा, अगर यह कभी भी नल पाता है)

यदि बहुत बड़ी सूचियां आम हैं तो हम कितने टकराव में न होने की कोशिश करते हुए जांच की गई संख्या को कम करना चाहते हैं। निम्नलिखित विभिन्न कार्यान्वयन की तुलना करें:

 public override int GetHashCode() { int res = 0x2D2816FE; int max = Math.Min(Count, 16); for(int i = 0, i != max; ++i) { var item = this[i]; res = res * 31 + (item == null ? 0 : item.GetHashCode()); } return res; } public override int GetHashCode() { int res = 0x2D2816FE; int min = Math.Max(-1, Count - 16); for(int i = Count -1, i != min; --i) { var item = this[i]; res = res * 31 + (item == null ? 0 : item.GetHashCode()); } return res; } public override int GetHashCode() { int res = 0x2D2816FE; int step = Count / 16 + 1; for(int i = 0, i < Count; i += step) { var item = this[i]; res = res * 31 + (item == null ? 0 : item.GetHashCode()); } return res; } 

उनमें से प्रत्येक ने जांच की गई वस्तुओं की कुल संख्या को सीमित किया है, जो निष्पादन की गति पर है, लेकिन खराब गुणवत्ता वाले जोखिमों का जोखिम। जो (यदि कोई है) सबसे अच्छा यह पर निर्भर करता है कि एक ही शुरुआत या समान अंत से संग्रह अधिक संभावना है या नहीं।

उपरोक्त संख्या को बदलना शेष राशि को समायोजित करता है; हैश टकराव के निचले जोखिम के साथ छोटे से तेज है लेकिन उच्चतर हैश गुणवत्ता बेहतर है।

संपादित करें: और अब आप स्पूकीहाश वी। 2 के अपने कार्यान्वयन का उपयोग कर सकते हैं v। 2 :

 public override int GetHashCode() { var hasher = new SpookyHash();//use methods with seeds if you need to prevent HashDos foreach(var item in this) hasher.Update(item.GetHashCode());//or relevant feeds of item, etc. return hasher.Final().GetHashCode(); } 

यह बहु + जोड़ या बदलाव + xor की तुलना में बेहतर वितरण बनाएगा, जबकि यह विशेष रूप से तेजी से हो रहा है (विशेषकर 64-बिट प्रक्रियाओं में एल्गोरिदम के लिए अनुकूलित है, हालांकि यह 32-बिट पर अच्छी तरह से काम करता है)।