हैशकोड किसके लिए उपयोग किया जाता है? क्या यह अद्वितीय है?


129

मुझे लगता है getHashCode()कि WP7 में प्रत्येक नियंत्रण, आइटम में एक विधि है, जो संख्या का एक क्रम लौटाता है। क्या मैं किसी आइटम की पहचान करने के लिए इस हैशकोड का उपयोग कर सकता हूं? उदाहरण के लिए, मैं डिवाइस में एक चित्र या एक गीत की पहचान करना चाहता हूं, और इसे जांचना चाहता हूं। यदि विशिष्ट वस्तुओं के लिए दिया गया हैशकोड अद्वितीय है तो यह किया जा सकता है।

क्या आप मुझे यह समझाने में मदद कर सकते हैं कि हैशकोड और इसके getHashCode()लिए क्या उपयोग है?


मुझे पता है कि हैशकोड का क्या मतलब है, मैं हैशकोड प्राप्त करने के लिए कई बार अपना कोड चलाने की कोशिश करता हूं और यह समान हैशटैम्स के लिए हर बार लौटाता है और डुप्लिकेट नहीं लगता है, लेकिन मैं अभी बहुत निश्चित नहीं हूं। ठीक है, यह ठीक है अगर आप को कम करना चाहते हैं, तो यह आपकी राय है। वैसे भी संपादन के लिए धन्यवाद!
नघिया गुयेन

7
मैं एरिक लिपर्ट के दिशानिर्देश और गेटहॉशकोड के नियमों को पढ़ने की सलाह देता हूं , हालांकि यह उन्हें उपयोग करने के नियमों के बजाय हैशकोड को लागू करने के लिए नियमों पर केंद्रित है ... जैसा कि वे " केवल एक चीज के लिए उपयोगी डिजाइन द्वारा : एक वस्तु को हैशटैग टेबल में रखकर
ब्रायन

जवाबों:


108

MSDN कहता है :

हैश कोड एक संख्यात्मक मान है जिसका उपयोग समानता परीक्षण के दौरान किसी वस्तु की पहचान करने के लिए किया जाता है। यह किसी संग्रह में किसी वस्तु के सूचकांक के रूप में भी काम कर सकता है।

गेटहैशकोड विधि हैशिंग एल्गोरिदम और हैश टेबल जैसे डेटा संरचनाओं में उपयोग के लिए उपयुक्त है।

GetHashCode पद्धति का डिफ़ॉल्ट कार्यान्वयन विभिन्न वस्तुओं के लिए अद्वितीय रिटर्न मानों की गारंटी नहीं देता है। इसके अलावा, .NET फ्रेमवर्क GetHashCode विधि के डिफ़ॉल्ट कार्यान्वयन की गारंटी नहीं देता है, और यह जो रिटर्न देता है वह .NET फ्रेमवर्क के विभिन्न संस्करणों के बीच समान होगा। नतीजतन, इस विधि के डिफ़ॉल्ट कार्यान्वयन का उपयोग हैशिंग उद्देश्यों के लिए एक अद्वितीय वस्तु पहचानकर्ता के रूप में नहीं किया जाना चाहिए।

गेटहैशकोड विधि को एक व्युत्पन्न प्रकार से ओवरराइड किया जा सकता है। मान प्रकार उस हैश फ़ंक्शन को प्रदान करने के लिए इस विधि को ओवरराइड करना चाहिए जो उस प्रकार के लिए उपयुक्त है और हैश तालिका में उपयोगी वितरण प्रदान करता है। विशिष्टता के लिए, हैश कोड किसी स्थिर फ़ील्ड या प्रॉपर्टी के बजाय किसी इंस्टेंस फ़ील्ड या प्रॉपर्टी के मान पर आधारित होना चाहिए।

Hashtable ऑब्जेक्ट में एक कुंजी के रूप में उपयोग की जाने वाली ऑब्जेक्ट्स को GetHashCode विधि को भी ओवरराइड करना चाहिए क्योंकि उन ऑब्जेक्ट्स को अपना हैश कोड उत्पन्न करना होगा। यदि कुंजी के रूप में उपयोग की जाने वाली वस्तु GetHashCode का उपयोगी कार्यान्वयन प्रदान नहीं करती है, तो आप हैशटेबल ऑब्जेक्ट के निर्माण के समय हैश कोड प्रदाता निर्दिष्ट कर सकते हैं। .NET फ्रेमवर्क संस्करण 2.0 से पहले, हैश कोड प्रदाता System.Collections.IHashCodeProvider इंटरफ़ेस पर आधारित था। संस्करण 2.0 के साथ, हैश कोड प्रदाता System.Collections.IEqualityComparer इंटरफ़ेस पर आधारित है।

मूल रूप से, हैश कोड संभव बनाने के लिए मौजूद है।
दो समान वस्तुओं को समान हैशकोड की गारंटी है।
दो असमान वस्तुओं को असमान हैशकोड की गारंटी नहीं है (इसे टकराव कहा जाता है)।


3
MSDN का उद्धरण अब पुराना है। MSDN अब हैश कोड के अद्वितीय नहीं होने के बारे में स्पष्ट नहीं है।
user34660

248

यह सब क्या है, यह सीखने के बाद, मैंने सादृश्य के माध्यम से एक उम्मीद के मुताबिक सरल विवरण लिखने की सोची:

सारांश: एक हैशकोड क्या है?

  • यह एक फिंगरप्रिंट है। हम इस फिंगर प्रिंट का उपयोग ब्याज के लोगों की पहचान करने के लिए कर सकते हैं।

ज़्यादा डिटेल्स के लिए नीचे पढ़ें:

हमशक्ल के रूप में सोचें कि हम किसी को विशिष्ट पहचान देने की कोशिश कर रहे हैं

मैं एक जासूस हूं, एक अपराधी की तलाश में हूं। आइए हम उसे मिस्टर क्रूएल कहते हैं। (वह एक कुख्यात हत्यारा था जब मैं एक बच्चा था - वह एक घर में घुस गया और एक गरीब लड़की का अपहरण कर उसकी हत्या कर दी, उसके शरीर को डस लिया और वह अभी भी ढीले पर बाहर है - लेकिन यह एक अलग मामला है)। श्री क्रूज़ की कुछ विशिष्ट विशेषताएं हैं, जिनका उपयोग मैं लोगों के समुद्र के बीच उनकी विशिष्ट पहचान करने के लिए कर सकता हूं। ऑस्ट्रेलिया में हमारे 25 मिलियन लोग हैं। उनमें से एक है मिस्टर क्रूएल। हम उसे कैसे पा सकते हैं?

मिस्टर क्रुएल को पहचानने के बुरे तरीके

जाहिर तौर पर मिस्टर क्रुएल की नीली आंखें हैं। यह बहुत मदद नहीं है क्योंकि ऑस्ट्रेलिया में लगभग आधी आबादी की नीली आँखें भी हैं।

मिस्टर क्रुएल को पहचानने के अच्छे तरीके

मैं और क्या उपयोग कर सकता हूं? मुझे पता है: मैं एक फिंगरप्रिंट का उपयोग करूँगा!

लाभ :

  • दो लोगों के लिए एक ही फिंगर प्रिंट लेना वास्तव में कठिन है (असंभव नहीं है, लेकिन बेहद संभावना नहीं है)।
  • श्री क्रूर का फिंगरप्रिंट कभी नहीं बदलेगा।
  • मिस्टर क्रुएल के हर एक हिस्से को पूरा किया जा रहा है: उनके रूप, बालों का रंग, व्यक्तित्व, खाने की आदतें आदि (आदर्श रूप से) उनके फिंगरप्रिंट में परिलक्षित होनी चाहिए, जैसे कि उनका कोई भाई है (जो बहुत समान है लेकिन समान नहीं है) - तो दोनों चाहिए है अलग फिंगर प्रिंट्स । मैं कहता हूं "चाहिए" क्योंकि हम 100% गारंटी नहीं दे सकते हैं कि इस दुनिया में दो लोगों के अलग-अलग फिंगरप्रिंट होंगे।
  • लेकिन हम हमेशा इस बात की गारंटी दे सकते हैं कि श्री क्रूर के पास हमेशा एक ही फिंगर प्रिंट होगा - और यह कि उनका फिंगरप्रिंट कभी भी नहीं बदलेगा।

उपरोक्त विशेषताएं आम तौर पर अच्छे हैश कार्यों के लिए होती हैं।

तो 'Collisions' के साथ क्या सौदा है?

तो कल्पना कीजिए कि अगर मुझे कोई लीड मिलती है और मुझे मिस्टर क्रुएल के फिंगरप्रिंट्स से मेल खाते हुए कोई व्यक्ति मिलता है। क्या इसका मतलब है कि मैंने मिस्टर क्रुएल पाया है?

........ शायद! मुझे एक करीब से देखना चाहिए। अगर मैं SHA256 (एक हैशिंग फ़ंक्शन) का उपयोग कर रहा हूं और मैं केवल 5 लोगों के साथ एक छोटे से शहर में देख रहा हूं - तो एक बहुत अच्छा मौका है जो मैंने उसे पाया है! लेकिन अगर मैं एमडी 5 (एक और प्रसिद्ध हैशिंग फ़ंक्शन) का उपयोग कर रहा हूं और + 2 ^ 1000 लोगों के साथ एक शहर में उंगलियों के निशान की जांच कर रहा हूं, तो यह काफी अच्छी संभावना है कि दो पूरी तरह से अलग-अलग लोगों के पास एक ही फिंगरप्रिंट हो सकता है।

तो इस सबका वैसे भी क्या फायदा है?

हैशकोड का एकमात्र वास्तविक लाभ यह है कि अगर आप हैश टेबल में कुछ डालना चाहते हैं - और हैश टेबल के साथ आप वस्तुओं को जल्दी से ढूंढना चाहेंगे - और हैश कोड आता है। वे आपको वास्तव में हैश टेबल में चीजों को खोजने की अनुमति देते हैं। जल्दी से। यह एक हैक है जो बड़े पैमाने पर प्रदर्शन में सुधार करता है, लेकिन सटीकता के एक छोटे से खर्च पर।

तो चलिए कल्पना करते हैं कि हम लोगों के पास एक हैश टेबल है - ऑस्ट्रेलिया में 25 मिलियन संदिग्ध। मिस्टर क्रूएल कहीं न कहीं ..... हम उसे वास्तव में जल्दी कैसे पा सकते हैं ? हमें उन सभी के माध्यम से छांटने की आवश्यकता है: एक संभावित मैच खोजने के लिए, या अन्यथा संभावित संदिग्धों को बरी करने के लिए। आप प्रत्येक व्यक्ति की विशिष्ट विशेषताओं पर विचार नहीं करना चाहते हैं क्योंकि इसमें बहुत अधिक समय लगेगा। इसके बजाय आप क्या उपयोग करेंगे? आप एक हैशकोड का उपयोग करेंगे! एक हैशकोड आपको बता सकता है कि क्या दो लोग अलग हैं। चाहे जो ब्लॉग्स मिस्टर क्रुएल न हों। यदि प्रिंट मेल नहीं खाते हैं, तो आप जानते हैं कि यह निश्चित रूप से श्री क्रूर नहीं है। लेकिन, अगर फिंगर प्रिंट मैच करते हैंतब आपके द्वारा उपयोग किए गए हैश फ़ंक्शन के आधार पर, संभावनाएं पहले से ही काफी अच्छी हैं जो आपने अपने आदमी को पाया। लेकिन यह 100% नहीं है। एकमात्र तरीका जिसे आप निश्चित कर सकते हैं, आगे की जांच करना है: (i) उसने / उसके पास एक अवसर / मकसद है, (ii) परीक्षा परिणाम आदि।

जब आप कंप्यूटर का उपयोग कर रहे हैं यदि दो वस्तुओं का समान हैश कोड मान है, तो आपको फिर से जांच करने की आवश्यकता है कि क्या वे वास्तव में समान हैं। उदाहरण के लिए, आपको यह जांचना होगा कि क्या ऑब्जेक्ट्स में समान ऊंचाई, समान वजन आदि हैं, यदि पूर्णांक समान हैं, या यदि ग्राहक_ एक मैच है, और फिर निष्कर्ष पर आते हैं कि क्या वे समान हैं। यह आमतौर पर एक IComparer या IEquality इंटरफेस को लागू करने के द्वारा किया जाता है।

मुख्य सारांश

तो मूल रूप से एक हैशकोड एक फिंगर प्रिंट है।

डिजिटल फिंगरप्रिंट - पिक्साबे के लिए चित्र विशेषता - https://pixabay.com/en/finger-fingerprint-security-digital-2081169/ पर उपयोग के लिए स्वतंत्र रूप से उपलब्ध है।

  1. दो अलग-अलग लोग / वस्तुएं सैद्धांतिक रूप से अभी भी एक ही फिंगरप्रिंट हो सकते हैं। या दूसरे शब्दों में। यदि आपके पास दो उंगली के निशान हैं जो समान हैं ......... तो उन्हें दोनों एक ही व्यक्ति / वस्तु से नहीं आने चाहिए।
  2. Buuuuuut, एक ही व्यक्ति / वस्तु हमेशा एक ही फिंगरप्रिंट लौटाएगा ।
  3. जिसका मतलब है कि अगर दो ऑब्जेक्ट अलग-अलग हैश कोड लौटाते हैं, तो आप 100% निश्चितता के लिए जानते हैं कि वे ऑब्जेक्ट अलग-अलग हैं।

उपरोक्त के चारों ओर अपना सिर पाने के लिए एक अच्छा 3 मिनट का समय लगता है। शायद इसे कुछ समय तक पढ़ें जब तक यह समझ में न आए। मुझे आशा है कि इससे किसी को मदद मिलेगी क्योंकि यह सब सीखने के लिए मुझे बहुत दुःख हुआ!


1
पुन :: MSDN प्रलेखन मेरे मस्तिष्क कोशिकाओं में से कुछ को मार डाला .... आत्महत्या के किनारे करने के लिए मेरा कुछ चलाई। केवल इसलिए बच गया क्योंकि मैं सो गया था;)
शोर्क

आपने उस अंत में टिप्पणी के साथ अपनी अच्छी व्याख्या को नष्ट कर दिया।
वाल्डेमार गौल्ज़िनोवस्की

मैं इसे प्यार करता था! मुख्य रूप से नाम "Mr.Cruel!
João Pedro Andrade Marques

एक सच्चे अपराध प्रशंसक के रूप में, यह संभवतः मेरा सबसे पसंदीदा एसओ उत्तर है ... कभी।
IfElseTryCatch

11

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

एक सामान्य हैश टेबल कार्यान्वयन हैशकोड मान से शुरू होता है, एक मापांक लेता है (इस प्रकार एक सीमा के भीतर मूल्य को बाधित करता है) और इसे "बकेट" की एक सरणी के सूचकांक के रूप में उपयोग करता है।


8

यह WP7 के लिए अद्वितीय नहीं है - यह सभी .Net वस्तुओं पर मौजूद है। यह उस प्रकार का है जो आप वर्णन करते हैं, लेकिन मैं इसे आपके ऐप्स में विशिष्ट पहचानकर्ता के रूप में अनुशंसित नहीं करूंगा, क्योंकि यह अद्वितीय होने की गारंटी नहीं है।

Object.GetHashCode विधि


4

यह यहाँ msdn लेख से है:

https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

"जब आप लोगों को यह कहते सुनाई देंगे कि हैश कोड किसी दिए गए इनपुट के लिए एक अद्वितीय मूल्य उत्पन्न करता है, तो तथ्य यह है कि पूरा करना मुश्किल है, लेकिन दो अलग-अलग डेटा इनपुट को खोजने के लिए तकनीकी रूप से संभव है कि एक ही मूल्य पर हैश । हालांकि, सही है। एक हैश एल्गोरिथ्म की प्रभावशीलता के बारे में कारकों का निर्धारण उत्पन्न हैश कोड की लंबाई और डेटा के जटिल होने की वजह से होता है। "

तो बस अपने डेटा आकार के लिए उपयुक्त हैश एल्गोरिथ्म का उपयोग करें और इसमें अद्वितीय हैशकोड होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.