2012-06-06 5 views
7

मेरे पास एक कस्टम ऑब्जेक्ट ऑब्जेक्ट है जो GetHashCode() को ओवरराइड करता है। मेरे पास हैशसेट है, और मैं एक ही हैश कोड वाले दो अलग-अलग ऑब्जेक्ट के साथ कॉल करने में सक्षम हूं। दोनों जोड़े गए हैं और बाद में मैं कुछ डेटाबेस सम्मिलन परेशानियों (प्राथमिक कुंजी डुप्लिकेट) के साथ समाप्त होता हूं ... हैशसेट का उपयोग करने का उद्देश्य इन डेटाबेस प्रविष्टियों से जुड़ा था (कुंजी टकराव से परहेज)।सी # हैशसेट एक ही getHashCode() मान के साथ दो ऑब्जेक्ट्स जोड़ने को स्वीकार क्यों कर रहा है?

क्या मैं संभवतः हैशसेट के कुछ गुणों पर छूट रहा हूं? यहां तक ​​कि जब मैं जोड़ने (.dd) जोड़ने से पहले जांच (प्रयास) करता हूं, तो मैं हैशकोड डुप्लीकेट जोड़ता हूं ...

+2

यदि हैशसेट के लिए दो मान डुप्लिकेट मानने के लिए हैश टक्कर पर्याप्त थी, तो यह बहुत बेकार होगा। असमान मूल्यों के लिए समान हैश की उम्मीद की जानी चाहिए। – delnan

+0

खैर, सही हैशिंग एक अवधारणा है जो – Jerome

उत्तर

22

क्योंकि HashSet<T> सदस्यता ऑब्जेक्ट समानता पर आधारित है, हैश कोड समानता नहीं है। के अनुसार सदस्य अलग-अलग हैं, जब तक कि HashSet<T> के प्रत्येक सदस्य के लिए यह एक ही हैश कोड है, जब तक कि सदस्य Equals के अनुसार अलग हैं। HashSet<T> में हैश कोड जो भूमिका निभाते हैं, वह सदस्यता की तीव्र जांच के लिए है। यदि आपके पास कोई ऑब्जेक्ट है और उसका हैश कोड HashSet<T> में नहीं है, तो आप जानते हैं कि ऑब्जेक्ट HashSet<T> में नहीं है। यदि आपके पास कोई ऑब्जेक्ट है और उसका हैश कोड HashSet<T> में है, तो आपको Equals का उपयोग करके समानता के लिए उसी हैश कोड परीक्षण के साथ ऑब्जेक्ट्स की श्रृंखला चलनी होगी ताकि यह देखने के लिए कि ऑब्जेक्ट वास्तव में HashSet<T> में है या नहीं। यही कारण है कि एक संतुलित हैश कोड वितरण महत्वपूर्ण है। लेकिन ऐसा नहीं है कि अद्वितीय हैश कोड आवश्यक हैं।

+0

समझ सकती है यह गलत कह रहा है कि हैशसेट समानता पर आधारित है, क्योंकि समानता और हैश कोड दोनों पर आधारित है। सबसे पहले एक हैश को सटीक पता चुनने के लिए गणना की जाती है, फिर तत्वों को टकराव सूची में रखने के लिए बराबर का उपयोग किया जाता है। –

+3

आप एक कार्यान्वयन विस्तार के बारे में बात कर रहे हैं। हैशसेट एक सेट है, और सदस्यता बराबर समानता द्वारा निर्धारित की जाती है। ऐसा होता है कि यह प्रदर्शन के लिए हैश कोड का उपयोग करता है। मेरा जवाब पढ़ें, और मैंने आपके द्वारा वर्णित तंत्र को पहले से ही इंगित किया है। कृपया डाउनवोट हटा दें। – jason

1

डुप्लिकेट मानों से बचने के लिए हैशसेट का उपयोग करें। हैश टेबल को संतुलित करने के लिए उनका इस्तेमाल करें!

+0

यह सवाल का जवाब नहीं देता है कि क्यों डुप्लिकेट हैंश की अनुमति है। –

+0

हू? डुप्लीकेट को फ़िल्टर करने के लिए सेट एक अच्छी पसंद है। जब तक * एक * अंतर नहीं है जो हैश और समानता और देखभाल में प्रतिबिंबित नहीं होता है, जिस वस्तु को बनाए रखा जाता है, लेकिन यह दुर्लभ लगता है। मुझे .NET दुनिया के बारे में बहुत कुछ पता नहीं है, शायद मुझे कुछ याद आती है? – delnan

+0

@ क्रिसशैन, डेलनान मैं ईमानदार रहूंगा, मैंने सोचा कि मैंने इसे एक टिप्पणी के रूप में जोड़ा है और अभी देखा है। – asawyer

8

GetHashCode ओवरराइड करना पर्याप्त नहीं है। आपको बराबर फ़ंक्शन को ओवरराइड करने की आवश्यकता है।

+0

यह क्यों मतदान किया जाता है? – GianT971

+1

यह क्यों कम किया गया था? हो सकता है कि * पूरा * उत्तर न हो, लेकिन निश्चित रूप से एक बिंदु शुरू करना है। तो मैं +1 के साथ समायोजित किया। –

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