2012-01-25 4 views
20

मैं कमांड लाइन पार्सर बनाने के साथ गड़बड़ कर रहा था और सोच रहा था कि किस प्रकार का हैश एल्गोरिदम पायथन स्कूल का उपयोग है?क्या हैश एल्गोरिदम पाइथन के शब्दकोश मैपिंग उपयोग करता है?

जिस तरह से मैंने इसे स्थापित किया है, मेरे पास एक पैटर्न मिलान एल्गोरिदम है जो एक शब्दकोश कुंजी के साथ टोकनयुक्त इनपुट अनुक्रमों से मेल खाता है। कुछ चाबियाँ अपेक्षाकृत लंबी हैं (6-7 वर्ण तारों की लंबाई 5 या 6 टुपल्स)। मैं सोच रहा था कि क्या कोई बिंदु था जिस पर लंबी शब्दकोश कुंजी महत्वपूर्ण पुनर्प्राप्ति की दक्षता को कम करती है।

+1

एक नज़र डालें [ऑब्जेक्ट्स/dictnotes.txt] (http://hg.python.org/cpython/file/2.7/Objects/dictnotes.txt) – jfs

+1

[इस प्रश्न] पर एक नज़र डालें (http://stackoverflow.com/questions/ 2070276/जहां-कर सकते हैं-ए-खोजने के स्रोत या एल्गोरिथ्म के- अजगर-हैश समारोह)। इसमें [इस पृष्ठ] का एक लिंक है (http://effbot.org/zone/python-hash.htm) जो वर्णन करता है कि कैसे पाइथन कुछ अलग प्रकार हैं और यह आपके लिए उपयोगी हो सकता है। – srgerg

उत्तर

23

हैश जो इसका उपयोग करता है उस वस्तु पर निर्भर करता है जो कुंजी के रूप में उपयोग किया जा रहा है - प्रत्येक वर्ग अपनी खुद की __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 

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

+0

ओह ठीक है। किसी कारण से मुझे लगता है कि पाइथन ने सभी डेटा प्रकारों के लिए एक सामान्य बाइटकोड हैश एल्गोरिदम का उपयोग किया है। जहां तक ​​हैश की चाबियाँ टकराती हैं, मुझे नहीं लगता कि यह एक मुद्दा होगा, क्योंकि मेरे पास की जाने वाली चाबियों की संख्या (अपेक्षाकृत) छोटी है - शायद हजारों में। मेरे अव्यवस्था को क्षमा करें, लेकिन टकराव हैश और रैखिक खोज कैसे सुरक्षा समस्या बन जाती है? –

+2

@ जोएल कॉर्नेट: यह एक सुरक्षा समस्या है क्योंकि हैश टेबल कुंजी को स्टोर करने के लिए बाल्टी का उपयोग करते हैं, और कुंजी एक ही हैश कोड के साथ एक ही बाल्टी को धोया जाएगा, हैश तालिका को प्रत्येक बार जब यह खोजता है तो रैखिक खोज करने के लिए मजबूर करता है कुंजी, जो बहुत अक्षम हो सकती है (और सेवा की अस्वीकार भी कर सकती है) यदि कुंजी की संख्या बड़ी है। अस्वीकार सेवा के हमलों का परिणाम हो सकता है यदि कोई प्रोग्राम एक हैश तालिका से मुकाबला करता है, जिसमें एक ही हैश कोड हैश हैश है। –

+0

यदि कोई हमलावर आपके शब्दकोश में उपयोग की जाने वाली कुंजियों को नियंत्रित कर सकता है, तो हो सकता है कि वे सैकड़ों या हजारों टकराव की चाबियां डालने में सक्षम हों, जिससे सम्मिलन संचालन बहुत धीमा हो जाए। कुछ मामलों में, यह मशीन को उत्तरदायी बनने का कारण बन सकता है, या डेटाबेस को अनुपयोगी बनने का कारण बन सकता है - एक डॉस हमला –