java जावा में हैशिंग कीज़




hashmap hashtable (4)

जावा में, जब मैं हाशमैप के लिए एक स्ट्रिंग के रूप में एक कुंजी का उपयोग करता हूं, तब मुझे थोड़ा अलग परिणाम मिलता है जब मैं हाशमैप में हैशकैप में एक कुंजी के रूप में उपयोग करता हूं।

कोई अंतर्दृष्टि?


HashCodes समान स्ट्रिंग के समान या अलग हो सकते हैं, इसलिए उस से सावधान रहें हो सकता है यही कारण है कि आपको एक अलग परिणाम मिल रहा है।

इसके बारे में एक और सवाल है जॉन स्कीट के स्वीकृत उत्तर देखें


जब मैं हाशमैप में एक कुंजी के रूप में स्ट्रिंग हैशोड का उपयोग करता हूं

आपको हैश कोड को कुंजी के रूप में उपयोग नहीं करना चाहिए हैश कोड अनन्य होने का इरादा नहीं है - इसे पूरी तरह से दो गैर-समान मानों के लिए अनुमति दी जाती है ताकि समान हैश कोड हो। आपको एक कुंजी के रूप में स्ट्रिंग का उपयोग करना चाहिए मैप फिर हैश कोड पहले की तुलना करेगा (जल्दी से उम्मीदवारों की संख्या कम करने के लिए) और फिर वास्तविक स्ट्रिंग समानता के equals तुलना करें।

बेशक, यह वास्तव में आपका कोड मान रहा है जैसा आपका प्रश्न बना देता है, जैसे

HashMap<String, String> goodMap = new HashMap<String, String>();
goodMap.put("foo", "bar");

HashMap<Integer, String> badMap = new HashMap<Integer, String>();
badMap.put("foo".hashCode(), "bar");

अगर यह वास्तव में आपके कोड की तरह दिखता है, तो बस HashMap<String, String> उपयोग करें

Object.hashCode() लिए डॉक्स से। Object.hashCode() (जोर खान):

हैश कोड का सामान्य अनुबंध है:

  • जब भी जावा अनुप्रयोग के निष्पादन के दौरान एक से अधिक बार एक ही ऑब्जेक्ट पर इसे लागू किया जाता है, हैश कोड विधि को लगातार एक ही पूर्णांक लौटा देना चाहिए, बशर्ते ऑब्जेक्ट पर समान तुलना में कोई भी जानकारी उपयोग नहीं की गई है। इस पूर्णांक को एक आवेदन के एक निष्पादन से एक ही आवेदन के दूसरे निष्पादन के अनुरूप नहीं रहना चाहिए।
  • अगर दो ऑब्जेक्ट बराबर (ऑब्जेक्ट) विधि के अनुसार समान हैं, तो दो ऑब्जेक्ट्स पर हैशोड विधि को बुलाते हुए समान पूर्णांक परिणाम उत्पन्न करना चाहिए।
  • यह आवश्यक नहीं है कि यदि दो ऑब्जेक्ट बराबर (java.lang.Object) विधि के अनुसार असमान हैं, तो दो ऑब्जेक्ट्स पर प्रत्येक हैशोड विधि पर कॉल करने से भिन्न पूर्णांक परिणाम प्रदर्शित किए जाने चाहिए। हालांकि, प्रोग्रामर को इस बात से अवगत होना चाहिए कि असमान ऑब्जेक्ट्स के लिए विशिष्ट पूर्णांक परिणाम बनाने से हैश तालिकाओं के प्रदर्शन में सुधार हो सकता है।

बेशक। अलग स्ट्रिंग्स के पास एक ही हैशोड हो सकता है, इसलिए यदि आप दो ऐसी स्ट्रिंग को किसी मैप में कुंजी के रूप में संग्रहीत करते हैं, तो आपके पास दो प्रविष्टियां होंगी (क्योंकि तार अलग हैं)। अगर आप अपने हैश कोड को कुंजी के रूप में उपयोग करते हैं, तो आपके पास केवल एक ही प्रविष्टि होगी (चूंकि उनके हैशोड एक समान है)।

हैश कोड को यह बताने के लिए उपयोग नहीं किया जाता है कि दो चाबियाँ समान हैं या नहीं। यह केवल चाबी के लिए एक बाल्टी प्रदान करने के लिए उपयोग किया जाता है बाल्टी मिल जाने के बाद, बाल्टी में मौजूद हर चीज की तुलना नई कुंजी से की जाती है, और चाबी को बाल्टी में जोड़ा जाता है, अगर कोई समान कुंजी नहीं मिल पाती।


समस्या ये है, भले ही दो ऑब्जेक्ट अलग-अलग हो, इसका मतलब यह नहीं है कि उनके हैशोड भी अलग हैं।

दो भिन्न ऑब्जेक्ट उसी हैशोड को साझा कर सकते हैं। तो, आपको उन्हें एक हैशमैप कुंजी के रूप में नहीं होना चाहिए

इसके अलावा, चूंकि Object.hashCode() . Object.hashCode() विधि से हैश कोड वापस होते हैं, वे प्रकार के प्रकार हैं, आपके पास केवल 2^32 अलग-अलग मान हो सकते हैं। यही कारण है कि अलग-अलग ऑब्जेक्ट के लिए हैशिंग एल्गोरिदम के आधार पर आपके पास "टकराव" होगा।

संक्षेप में: -

!obj.equals(obj1) सुनिश्चित नहीं करता है कि obj.hashCode() != obj1.hashCode()







string-hashing