2010-06-18 34 views
5

मैंने this पर विकिपीडिया पेज देखा है, लेकिन मुझे अभी भी यह समझ में नहीं आया है। क्या कोई हैशिंग, हैशटेबल/हैशपैप, और हैश फ़ंक्शंस की अवधारणाओं को समझने के लिए कृपया मेरे मंद मन को मदद कर सकता है? कुछ उदाहरण वास्तव में मदद करेंगे।जावा में हैश फ़ंक्शन क्या है?

+3

विकिपीडिया लेख के बारे में आप क्या समझते हैं? अन्यथा हम एक ही जानकारी दोहराएंगे। – polygenelubricants

+1

लेख मुझे स्पष्ट रूप से स्पष्ट लगता है, इसलिए मुझे सामान्य रूप से वैकल्पिक व्याख्या के साथ आना मुश्किल लगेगा। क्या आप इस लेख में समझ में नहीं आ रहे हैं कि आप इस बारे में अधिक विशिष्ट हो सकते हैं? –

+0

एक उदाहरण या कोड नमूना कम से कम मदद करेगा। –

उत्तर

16

विकिपीडिया लेख में बहुत सारी तकनीकी जानकारी होगी, लेकिन हैशिंग का एक सरल दृष्टिकोण निम्न जैसा है।

कल्पना कीजिए कि एक जादुई फ़ंक्शन है जो किसी ऑब्जेक्ट को नंबर दे सकता है। एक ही वस्तु को देखते हुए, यह हमेशा एक ही संख्या लौटाता है।

तत्काल अब आपके पास परीक्षण करने का एक त्वरित तरीका है यदि दो ऑब्जेक्ट समान हैं: इस फ़ंक्शन को उनकी संख्याओं के लिए पूछें और तुलना करें। यदि वे अलग हैं, तो वे वही नहीं हैं।

लेकिन अगर उनके पास समान संख्या है तो क्या होगा? क्या दो अलग-अलग वस्तुओं में एक ही संख्या हो सकती है?

हां, यह अधिकांश परिदृश्य में संभव है। आइए मान लें कि फ़ंक्शन केवल 1.10 के बीच संख्याएं दे सकता है, उदाहरण के लिए, और 100 अलग-अलग ऑब्जेक्ट्स हैं। फिर निश्चित रूप से कुछ अलग-अलग वस्तुओं में एक ही संख्या होनी चाहिए। इसे "टकराव" कहा जाता है। एक "टकराव" हमारे त्वरित समानता परीक्षण को उतना उपयोगी नहीं बनाता है, जितना संभव हो सके हम इसे घटित करना चाहते हैं। एक अच्छा जादुई कार्य वह है जो "टकराव" की संख्या को कम करने की कोशिश करेगा।

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

1

This पुस्तक (और supporting video lectures) एल्गोरिदम और डेटा संरचनाओं के कुछ महान स्पष्टीकरण प्रदान करते हैं। हैश फ़ंक्शन के बारे में कुछ व्याख्यान हैं (1, 2)। मैं इसकी सिफारिश करता हूं।

Cormen http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/chp_6046textcove.jpg

इसके अलावा, बस FYI करें, hashCode(), Object वर्ग का एक उदाहरण पर बुलाया स्मृति में इस विशेष उदाहरण के एक पते देता है। टिप्पणियों में polygenelubricants द्वारा इंगित की गई वास्तव में सच नहीं है।

+0

एफवाईआई, आपका एफवाईआई आधा सच है। Http://java.sun.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29 - ऑब्जेक्ट का आंतरिक पता एक पूर्णांक/इस क्रियान्वयन तकनीक में "कनवर्ट करना" 'आवश्यक नहीं है" – polygenelubricants

+0

मैं चिंतित हूं। क्या आप कृपया अधिक विशिष्ट हो सकते हैं? :) – folone

+0

लेकिन क्या यह कक्षाओं के लिए एक सिफारिश नहीं है, जो इस विधि को ओवरराइड करता है? इसके बजाय मैं 'ऑब्जेक्ट' वर्ग के उदाहरणों के बारे में बात कर रहा हूं। – folone

0

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

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

1

एक हैश फ़ंक्शन एक मनमाने ढंग से बड़ी मात्रा में डेटा का कॉम्पैक्ट प्रतिनिधित्व बनाने का एक तरीका है। हैशकोड विधि के साथ जावा में इसका मतलब किसी भी प्रकार (4 बाइट्स) में किसी भी तरह से आपके ऑब्जेक्ट की स्थिति (चाहे कितना बड़ा हो) का वर्णन कर रहा हो। और आमतौर पर नीचे वर्णित के रूप में काफी तेजी से लिखा जाता है।

हैशटबल्स/हैशमैप्स में सरलीकृत करने के लिए हैशकोड एक सस्ते बराबर के रूप में कार्य करता है। दो ऑब्जेक्ट्स ए और बी प्रकार ले लो फू आइए यह पता लगाने के लिए कहता है कि क्या एक .equals (बी) 500 एमएस लेता है जहां एक (कुशल) हैशकोड की गणना करने के रूप में केवल 10ms लेते हैं। तो अगर हम जानना चाहते हैं कि क्या ए।बराबर (बी) सीधे ऐसा करने के बजाय हम हैशकोड देखेंगे और पूछेंगे a.hashCode() == b.hashCode()। ध्यान दें कि यह हमारे उदाहरण में केवल 20ms लेगा।

हैशकोड की एपीआई परिभाषा के कारण हम जानते हैं कि का हैशकोड बी के बराबर नहीं है तो a.equals (बी) कभी भी सत्य नहीं होना चाहिए। तो हमारे उपरोक्त परीक्षण में यदि हम हैंशकोड असमान हैं तो हमें कभी भी लंबे समय तक असर() परीक्षण करने की आवश्यकता नहीं है, यही कारण है कि आपको हमेशा हैशकोड ओवरराइड करना चाहिए और के साथ बराबर होना चाहिए।

आप "अच्छा" या "अच्छी तरह से वितरित" हैशकोड लिखने के संदर्भ भी देख सकते हैं। इसे इस तथ्य के साथ करना है कि हैशकोड और बराबर के बारे में पिछले बयान के विपरीत सत्य नहीं है। अधिक विशेष रूप से a.hashCode() == b.hashCode() जरूरी नहीं है कि एक .equals (बी) तो एक अच्छा हैशकोड का विचार है कि आप a.hashCode() == b.hashCode की संभावना को कम करते हैं () जब a.equals (बी) गलत है। आपने इसे हैश फ़ंक्शन की टकराव के रूप में संदर्भित किया होगा।

हैशपैप्स/टेबल पर वापस जाएं। ये कुंजी/मूल्य जोड़े पर आधारित हैं। तो जब आप कोई मूल्य जोड़ते या पुनर्प्राप्त करते हैं तो आप एक कुंजी प्रदान करेंगे। तो नक्शा को पहली चीज करना है कुंजी की तलाश करना, जिसका अर्थ है कि कुछ जो आपको प्रदान करता है .equals() जो कुंजी आप प्रदान करते हैं। लेकिन जैसा कि हमने उपर्युक्त चर्चा की है .equals() अविश्वसनीय रूप से धीमा हो सकता है जिसका मतलब है कि पहले हैशकोड की जांच करके तुलना बहुत अधिक हो सकती है। चूंकि हैशकोड अच्छी तरह से वितरित किए जाते हैं, इसलिए आपको तुरंत पता होना चाहिए कि एक्स निश्चित रूप से कब है! = Y।

अब तुलना HashMaps के अलावा/टेबल वास्तव में hashcodes डेटा के अपने आंतरिक भंडारण को व्यवस्थित करने, का उपयोग हालांकि मुझे लगता है कि आप इस बिंदु पर समझने के लिए देख रहे हैं क्या के दायरे से बाहर है।

0

हैश तालिका के सूचकांक के लिए कुंजी की मैपिंग को हैश फ़ंक्शन कहा जाता है। हैश फ़ंक्शन में दो भाग

हैश कोड मानचित्र: यह कुंजी को किसी भी श्रेणी के पूर्णांक में परिवर्तित करता है।

संपीड़न मानचित्र: यह इन पूर्णांक को कुंजी हैशटेबल की सीमा में परिवर्तित करता है (लाता है)।

http://coder2design.com/hashing/

0

हैश समारोह से लिया: आप कितनी भी बार यह कार्य करने के लिए एक ही वस्तु पार कर लेते हैं, यह पाठ, द्विआधारी या संख्या है, तो आप हमेशा एक ही आउटपुट प्राप्त हो। हैश तालिका उद्देश्यों के लिए एक पूर्णांक लौटने वाले हैश फ़ंक्शन का उपयोग किया जाता है।

उपरोक्त कार्यक्षमता हैशिंग को बुला रही है।

हैश तालिका: कंप्यूटर विज्ञान की चमत्कारिक डेटा संरचना जो निरंतर समय या ओ (1) में खोज परिणाम देता है। यह हैशिंग की उपरोक्त अवधारणा पर आधारित है। तो, इसमें लिंक्डलिस्ट, बाइनरी सर्च पेड़ इत्यादि से बेहतर पहुंच समय है।

क्यों लगभग ओ (1): यह ऑब्जेक्ट को स्टोर करने के लिए आंतरिक रूप से अपनी आधार संरचना के रूप में एक सरणी का उपयोग करता है और चूंकि सरणी के पास लगातार पहुंच का समय होता है, हैश टेबल भी करता है।

[मूल आंतरिक]: तो, यह आंतरिक रूप से निश्चित आकार की एक सरणी का उपयोग करता है और जब आप एक (कुंजी, मान) जोड़ी डालते हैं, तो यह कुंजी के हैश की गणना करता है और इस हैश मान का उपयोग इंडेक्स के रूप में करता है (कुंजी, मूल्य) सरणी में जोड़ी। अगला, जब आप एक ही कुंजी का उपयोग कर ऑब्जेक्ट की खोज करते हैं, तो यह सरणी में कुंजी की खोज करने के लिए इंडेक्स के रूप में कुंजी के हैश का उपयोग करता है। अब, दो वस्तुओं में एक ही हैश मान हो सकता है और इसलिए, हैश तालिका में इन ऑब्जेक्ट्स को डालने के दौरान टकराव होगा। टकराव के संकल्प के दो तरीके हैं। आप इस विषय पर पर्याप्त विस्तृत चर्चा के लिए इस link का उल्लेख कर सकते हैं।

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