हैश जो इसका उपयोग करता है उस वस्तु पर निर्भर करता है जो कुंजी के रूप में उपयोग किया जा रहा है - प्रत्येक वर्ग अपनी खुद की __hash __() विधि को परिभाषित कर सकती है, और यह मान जो किसी विशेष उदाहरण के लिए लौटाता है वह शब्दकोश के लिए उपयोग किया जाता है।
पायथन स्वयं स्ट्र और टुपल प्रकारों के लिए हैश कार्यान्वयन प्रदान करता है। स्रोत पर एक त्वरित रूप से उन लोगों के लिए सटीक एल्गोरिदम प्रकट करना चाहिए।
एक ट्यूपल का हैश इसकी सामग्री के हैंश पर आधारित है। एल्गोरिथ्म अनिवार्य है इस (सरलीकृत थोड़ा):
def hash(tuple):
mult = 1000003
x = 0x345678
for index, item in enumerate(tuple):
x = ((x^hash(item)) * mult) & (1<<32)
mult += (82520 + (len(tuple)-index)*2)
return x + 97531
तार के लिए, दुभाषिया भी हर चरित्र से अधिक दोहराता, उन्हें इस (फिर से, थोड़ा सरलीकृत) एल्गोरिथ्म के साथ संयोजन:
def hash(string):
x = string[0] << 7
for chr in string[1:]:
x = ((1000003 * x)^chr) & (1<<32)
return x
एक बड़ा मुद्दा हैश टकराव से बचने के बारे में चिंता करने के लिए। हैश कुंजी को टकराने से रैखिक खोज हो जाएगी क्योंकि शब्दकोश नई वस्तु को स्टोर करने के लिए एक जगह खोजने की कोशिश करता है (इसे अब सुरक्षा समस्या के रूप में पहचाना जा रहा है, और यह व्यवहार आगामी पायथन संस्करणों में बदल रहा है)
स्रोत
2012-01-25 04:56:28
एक नज़र डालें [ऑब्जेक्ट्स/dictnotes.txt] (http://hg.python.org/cpython/file/2.7/Objects/dictnotes.txt) – jfs
[इस प्रश्न] पर एक नज़र डालें (http://stackoverflow.com/questions/ 2070276/जहां-कर सकते हैं-ए-खोजने के स्रोत या एल्गोरिथ्म के- अजगर-हैश समारोह)। इसमें [इस पृष्ठ] का एक लिंक है (http://effbot.org/zone/python-hash.htm) जो वर्णन करता है कि कैसे पाइथन कुछ अलग प्रकार हैं और यह आपके लिए उपयोगी हो सकता है। – srgerg