कोई भी हैश एल्गोरिदम जो वास्तव में अपना काम सही ढंग से करता है ओ (लेन (बी)) समय का उपयोग करेगा। तो इसका उत्तर "ऐसा करने का कोई तेज़ तरीका है" नहीं है।
यदि आपकी वास्तविक चिंता मेमोरी उपयोग है, तो आप सिद्धांत रूप से, __hash__
विधि को बायटियर के उप-वर्ग में जोड़ सकते हैं। लेकिन यह एक बहुत बुरा विचार है। देखो क्या होता है:
>>> class HashableBytearray(bytearray):
... def __hash__(self):
... return hash(str(self))
...
>>> h = HashableBytearray('abcd')
>>> hash(h)
-2835746963027601024
>>> h[2] = 'z'
>>> hash(h)
-2835746963002600949
तो एक ही वस्तु शब्दकोश में दो अलग-अलग धब्बे, जो नहीं होना है करने के लिए हैश सकता है। और यह बदतर हो जाता है:
>>> d = dict()
>>> hb1 = HashableBytearray('abcd')
>>> hb2 = HashableBytearray('abcd')
>>> d[hb1] = 0
>>> d[hb2] = 1
>>> d
{bytearray(b'abcd'): 1}
ठीक है, अब तक, अच्छा है। मान बराबर हैं, इसलिए शब्दकोश में केवल एक ही वस्तु होनी चाहिए। सबकुछ अपेक्षित के रूप में काम कर रहा है।
देखें कि भले ही hb2
बिल्कुल नहीं बदला है, यह इस समय शब्दकोश में एक नया कुंजी-मान पेयर बनाया: अब जब हम hb1
बदलने देखते हैं क्या होता है?
हर बार जब मैंने d
पर कुंजी पारित की, तो वह कुंजी 'abcd'
के बराबर थी। लेकिन क्योंकि पहली कुंजी के मान को के बाद शब्दकोश में जोड़ा जा रहा है, इसलिए पाइथन यह नहीं बता सका कि नई कुंजी का मान वही था जब पुरानी कुंजी को जोड़ा गया था। अब शब्दकोश में दो कुंजी-मूल्य जोड़े हैं, जब केवल एक होना चाहिए।
यह केवल कई तरीकों में से एक है कि कुंजियों के रूप में परिवर्तनीय मानों का उपयोग करके अप्रत्याशित और बहुत गलत व्यवहार हो सकता है। बस bytearray
को एक अपरिवर्तनीय प्रकार में परिवर्तित करें, या पहले स्थान पर अपरिवर्तनीय प्रकारों के साथ काम करें।
और जिज्ञासु के लिए: सुनिश्चित करें कि, buffer
पहले हैश कैश, लेकिन यह बिल्कुल भी मदद नहीं करता है। है कि आप प्रयोग कर रहे हैं
>>> d
{<read-only buffer for 0x1004a2300, size -1, offset 0 at 0x100499cb0>: 1,
<read-only buffer for 0x1004a2420, size -1, offset 0 at 0x100499cf0>: 0,
<read-only buffer for 0x1004a22d0, size -1, offset 0 at 0x100499c70>: 2}
आप हैश टकराव कैसे संभालेंगे? – Cameron
समस्या टकराव नहीं है, यह तब होता है जब आप कुंजी को म्यूट करते हैं। – FogleBird
पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? – jedwards