यह एक लंबा जवाब होने वाला है, एक ड्रिंक को पकड़ो और पढ़ें ...
हैशिंग स्मृति में एक महत्वपूर्ण-मूल्य जोड़ी को संग्रहीत करने के बारे में है जिसे तेजी से पढ़ा और लिखा जा सकता है। यह एक सरणी में कुंजियाँ और एक लिंक्डलिस्ट में मूल्यों को संग्रहीत करता है।
कहते हैं कि मैं 4 प्रमुख मूल्य जोड़े स्टोर करना चाहता हूं -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
इसलिए कुंजियों को संग्रहीत करने के लिए हमें 4 तत्व की एक सरणी की आवश्यकता होती है। अब मैं इन 4 चाबियों में से एक को 4 सरणी इंडेक्स (0,1,2,3) में कैसे मैप करूं?
इसलिए जावा व्यक्तिगत चाबियों का हैशकोड ढूंढता है और उन्हें एक विशेष सरणी इंडेक्स में मैप करता है। हैशकोड सूत्र है -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
हैश और लड़की !! मुझे पता है कि आप क्या सोच रहे हैं। उस जंगली युगल के बारे में आपके आकर्षण ने आपको एक महत्वपूर्ण बात याद दिला दी।
जावा को 31 से गुणा क्यों करें?
ऐसा इसलिए है, क्योंकि 31 ^ 5 - 1 के रूप में 31 एक विषम प्राइम है। और विषम प्रधान हाश टकराव की संभावना को कम करता है
अब इस हैश कोड को एक सरणी सूचकांक में कैसे मैप किया जाता है?
जवाब है , Hash Code % (Array length -1)
। तो हमारे मामले में “girl”
मैप किया गया (3173020 % 3) = 1
है। जो सरणी का दूसरा तत्व है।
और मान "आहान" एरे इंडेक्स 1 से जुड़े लिंक्डलिस्ट में संग्रहीत है।
HashCollision - यदि आप hasHCode
कुंजियों को खोजने की कोशिश करते हैं “misused”
और “horsemints”
ऊपर वर्णित सूत्रों का उपयोग करके आप दोनों को एक समान देते हुए देखेंगे1069518484
। Whooaa !! सबक सीखना -
2 समान ऑब्जेक्ट में समान हैशकोड होना चाहिए लेकिन हैशकोड से मेल खाता है तो ऑब्जेक्ट समान हैं। तो इसे "दुरुपयोग" और "घुड़सवार" के समान दोनों मानों को बाल्टी 1 (1069518484% 3) में संग्रहीत करना चाहिए।
अब हैश मैप जैसा दिखता है -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
अब अगर कुछ निकाय कुंजी के लिए मान ज्ञात करने का प्रयास करते हैं “horsemints”
, तो जावा जल्दी से इसका हैशकोड पा लेगा, इसे मॉड्यूल कर देगा और इसके लिए लिंक्डलिस्ट में मान खोजना शुरू कर देगाindex 1
। तो इस तरह से हमें सभी 4 सरणी इंडेक्स की खोज करने की आवश्यकता नहीं है, जिससे डेटा एक्सेस तेजी से हो सके।
लेकिन, रुको, एक सेकंड। उस लिंक्डलिस्ट में एरियर इंडेक्स 1 में 3 मान हैं, यह कैसे पता चलता है कि कुंजी "हॉर्स मार्क" के लिए कौन सा मूल्य था?
वास्तव में मैंने झूठ बोला था, जब मैंने कहा था कि हाशप सिर्फ लिंक्डलिस्ट में मूल्यों को संग्रहीत करता है।
यह मानचित्र प्रविष्टि के रूप में दोनों प्रमुख मूल्य जोड़े को संग्रहीत करता है। तो वास्तव में मानचित्र इस तरह दिखता है।
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
अब आप देख सकते हैं कि ArrayIndex1 से जुड़े लिंकलिस्ट के माध्यम से ट्रेस करने के दौरान यह वास्तव में उस लिंक्डलिस्ट के प्रत्येक प्रविष्टि की कुंजी की तुलना "हॉर्समिंटस" से करता है और जब वह पाता है तो वह इसका मान लौटाता है।
आशा है कि इसे पढ़ते हुए आपको मज़ा आया होगा :)