आपकी मुख्य समस्या वास्तव में डिक्ट्स और सेट के साथ होगी। यदि आप किसी ऑब्जेक्ट को किसी dict/set में सम्मिलित करते हैं, और उस ऑब्जेक्ट के हैश में परिवर्तन होते हैं, तो जब आप उस ऑब्जेक्ट को पुनर्प्राप्त करने का प्रयास करते हैं तो आप अलग-अलग स्पॉट को निर्देश/सेट के अंतर्निहित सरणी में देख सकते हैं और इसलिए नहीं मिलेगा वस्तु। यही कारण है कि क्यों dict कुंजी हमेशा अपरिवर्तनीय होना चाहिए।
यहां एक छोटा उदाहरण है: मान लीजिए कि हम एक dict में o
डाल दें, और o
की प्रारंभिक हैश 3. है हम कुछ इस तरह करना होगा (एक मामूली सरलीकरण लेकिन भर में बिंदु हो जाता है):
Hash table:
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| | | | o | | | | |
+---+---+---+---+---+---+---+---+
^
we put o here, since it hashed to 3
अब मान लें कि o
का हैश 6
में बदल गया है। यदि हम dict से o
पुनर्प्राप्त करना चाहते हैं, तो हम स्पॉट 6
देखेंगे, लेकिन वहां कुछ भी नहीं है! डेटा संरचना से पूछताछ करते समय यह झूठी नकारात्मक होगी। हकीकत में, उपरोक्त सरणी के प्रत्येक तत्व में एक नियम के मामले में इसके साथ "मूल्य" जुड़ा हो सकता है, और एक ही स्थान में कई तत्व हो सकते हैं (उदा। hash collision)। साथ ही, तत्व को कहां रखना है, यह तय करते समय हम आम तौर पर हैश मान मॉड्यूलो सरणी के आकार लेते हैं। इन सभी विवरणों के बावजूद, उपर्युक्त उदाहरण अभी भी सटीक रूप से बताता है कि किसी ऑब्जेक्ट के हैश कोड में परिवर्तन होने पर क्या गलत हो सकता है।
क्या यह दुभाषिया, या दूषित आंतरिक संरचनाओं को क्रैश कर सकता है?
नहीं, ऐसा नहीं होगा। जब हम कहते हैं कि किसी ऑब्जेक्ट के हैश बदलना "खतरनाक" है, तो हम इस अर्थ में खतरनाक हैं कि यह अनिवार्य रूप से हैशिंग के उद्देश्य को हरा देता है और अगर कोड के बारे में तर्क करना मुश्किल हो जाता है तो कोड मुश्किल हो जाता है। हम इस अर्थ में खतरनाक नहीं हैं कि यह दुर्घटनाओं का कारण बन सकता है।
इस तरह के कोड को कभी भी "क्रैश" या "भ्रष्ट" रन-टाइम नहीं होना चाहिए, लेकिन वास्तव में dict/set उपयोग वास्तव में .. समस्याग्रस्त हो जाएगा। – user2864740
शायद आपके 'BadIdea' ऑब्जेक्ट के बारे में सबसे बुरी चीजों में से एक यह तथ्य है कि यह केवल 10,000 संभावित हैंश का एक सेट तैयार करने में सक्षम है, इस प्रकार 'अपेक्षाकृत महंगा हैश टकराव '' '' '' '' '' '' '' ' के साथ सौदा करना है। –
@ दो-बिट एल्केमिस्ट अच्छी तरह से आपकी समस्याओं का कम से कम है। – arshajii