असल में, मैं अब तक निम्नलिखित है:जटिल समानता के लिए ऑब्जेक्ट.गेटहाशकोड() को कार्यान्वित करने के बारे में मुझे कैसे जाना चाहिए?
class Foo {
public override bool Equals(object obj)
{
Foo d = obj as Foo ;
if (d == null)
return false;
return this.Equals(d);
}
#region IEquatable<Foo> Members
public bool Equals(Foo other)
{
if (this.Guid != String.Empty && this.Guid == other.Guid)
return true;
else if (this.Guid != String.Empty || other.Guid != String.Empty)
return false;
if (this.Title == other.Title &&
this.PublishDate == other.PublishDate &&
this.Description == other.Description)
return true;
return false;
}
}
तो, समस्या यह है: मैं एक गैर आवश्यक फ़ील्ड Guid
है, जो एक अद्वितीय पहचानकर्ता है। यदि यह सेट नहीं है, तो मुझे यह निर्धारित करने के प्रयास के रूप में कम सटीक मीट्रिक के आधार पर समानता निर्धारित करने की आवश्यकता है कि दो ऑब्जेक्ट बराबर हैं या नहीं। यह ठीक काम करता है, लेकिन यह GetHashCode()
गन्दा बनाता है ... मुझे इसके बारे में कैसे जाना चाहिए? एक अनुभवहीन कार्यान्वयन कुछ की तरह होगा:
public override int GetHashCode() {
if (this.Guid != String.Empty)
return this.Guid.GetHashCode();
int hash = 37;
hash = hash * 23 + this.Title.GetHashCode();
hash = hash * 23 + this.PublishDate.GetHashCode();
hash = hash * 23 + this.Description.GetHashCode();
return hash;
}
लेकिन हैश टकराने के दो प्रकार की संभावना क्या हैं? निश्चित रूप से, मैं उम्मीद नहीं करता कि यह 1 in 2 ** 32
हो। क्या यह एक बुरा विचार है, और यदि हां, तो मुझे यह कैसे करना चाहिए?
यह अधिक महत्वपूर्ण है कि आपके हैश एल्गोरिदम वितरण की तुलना में आपके समानता एल्गोरिदम से सहमत हैं। याद रखें, हैश का उद्देश्य पूरी तरह से हैश तालिका में सभ्य वितरण प्राप्त करना है; जब तक आप एक विशेष बाल्टी के लिए बड़े पैमाने पर skewed नहीं हैं, बाधाएं अच्छी हैं आप ठीक हो जाएगा। यदि आप चिंतित हैं, तो एक उचित परिदृश्य चुनें कि आपके ऑब्जेक्ट के उपभोक्ता को सामना करना पड़ सकता है - कहें, उनमें से कुछ सौ एक शब्दकोश में डालें, यदि यह उचित है - और यह देखने के लिए कुछ पेर्फ परीक्षण करें कि आप स्वीकार्य हैं या नहीं परिणाम है। –
मैंने कभी भी वास्तविक उपयोग में देखा है ~ 200 था, लेकिन सामान्य उपयोग <30 है, तो आप शायद सही हैं। –
हेक, 30 से कम वस्तुओं के साथ, एक लिंक्ड सूची में एक रैखिक खोज संभवतः निष्पादक है। आप हमेशा शून्य का हैश कोड वापस कर सकते हैं, टकराव का 100% मौका है, और फिर भी स्वीकार्य प्रदर्शन मिलता है। हैश कोड का अच्छा वितरण होने का बिंदु प्रदर्शन आकार को बड़ा करना है जब शब्दकोश का आकार बड़ा हो जाता है। यदि आप केवल टेबल में छोटी संख्या में आइटम डालने जा रहे हैं तो आप एक लुभावनी वितरण कर सकते हैं और अभी भी अच्छे परिणाम प्राप्त कर सकते हैं। –