हे सब, मैं .NET में ऑब्जेक्ट्स के लिए GetHashCode() ओवरराइड को लागू करने का सबसे अच्छा तरीका पढ़ रहा हूं, और अधिकांश उत्तरों में जो भी मैं दौड़ता हूं, उन सदस्यों से मिलकर संख्याओं को एक साथ जोड़ता है एक विधि के साथ आने के लिए संख्यात्मक प्रकार। समस्या यह है कि, मेरे पास एक ऑब्जेक्ट है जो अल्फान्यूमेरिक स्ट्रिंग का उपयोग अपनी कुंजी के रूप में करता है, और मैं सोच रहा हूं कि स्ट्रिंग्स के साथ स्ट्रिंग वाले ऑब्जेक्ट्स के लिए आंतरिक आईडी का उपयोग करने के साथ कुछ मूलभूत रूप से गलत है, तो निम्न की तरह कुछ?स्ट्रिंग कुंजियों के साथ GetHashCode()
// Override GetHashCode() to return a permanent, unique identifier for
// this object.
static private int m_next_hash_id = 1;
private int m_hash_code = 0;
public override int GetHashCode() {
if (this.m_hash_code == 0)
this.m_hash_code = <type>.m_next_hash_id++;
return this.m_hash_code;
}
वहाँ एक बेहतर तरीका है एक वस्तु उसके प्रमुख के रूप में एक अल्फ़ान्यूमेरिक स्ट्रिंग का उपयोग करता है के लिए एक अनूठा हैश कोड साथ आने के लिए है? (और नहीं, अल्फान्यूमेरिक स्ट्रिंग के संख्यात्मक भाग अद्वितीय नहीं हैं; इनमें से कुछ तारों में वास्तव में उनमें संख्याएं नहीं हैं।) किसी भी विचार की सराहना की जाएगी!
लेकिन क्या होगा यदि वह स्ट्रिंग बदलती है? उदाहरण के लिए, मैं एक नया उपयोगकर्ता ऑब्जेक्ट बना सकता हूं: उपयोगकर्ता foo = new user(); और कन्स्ट्रक्टर उपयोगकर्ता.आईडी = "" सेट करता है। बाद में, अगर मैं उपयोगकर्ता कहता हूं। आईडी = "ए 12345"; और मैं इसे वापस भेजता हूं। आईडी.गेटशैशकोड() foo.GetHashCode() के परिणामस्वरूप, क्या यह परिवर्तित नहीं होगा, इस सिद्धांत का उल्लंघन करना कि किसी ऑब्जेक्ट के हैश कोड को कभी नहीं बदला जाना चाहिए? –
ऑब्जेक्ट बदल गया। हैश कोड * को भी बदलना है *। –
@ किंग - हैश कोड का उपयोग करने के कुछ अलग-अलग तरीके हैं। हैश कोड का मान हमेशा एक ही प्रारंभिक मान के समान होना चाहिए। यदि आपका मान उत्परिवर्तनीय है, तो आपको परिणामी हैशकोड को स्टोर करने की आवश्यकता है और इसके बजाय 'GetHashCode()' कहा जाता है। –