अधिकांश उत्तर बताते हैं कि यह विभिन्न प्लेटफार्मों के कारण है, लेकिन इसमें और भी बहुत कुछ है। से के प्रलेखनobject.__hash__(self)
:
डिफ़ॉल्ट रूप __hash__()
से str
, bytes
और
datetime
ऑब्जेक्ट्स के मान एक अप्रत्याशित यादृच्छिक मान के साथ "नमकीन" होते हैं। यद्यपि वे एक व्यक्तिगत पायथन प्रक्रिया के भीतर स्थिर रहते हैं, वे पायथन के बार-बार होने वाले आक्रमणों के बीच अनुमानित नहीं हैं।
इसका उद्देश्य सावधानी से चुने गए इनपुट के कारण एक इनकार-सेवा के खिलाफ सुरक्षा प्रदान करना है जो एक तानाशाही प्रविष्टि, ओ (n²) जटिलता के सबसे खराब मामले के प्रदर्शन का शोषण करता है। देखें
http://www.ocert.org/advisories/ocert-2011-003.html जानकारी के लिए।
हैश मान बदलने की यात्रा के क्रम को प्रभावित करता है dicts
, sets
और अन्य मैपिंग। पायथन ने इस आदेश के बारे में कभी गारंटी नहीं दी है (और यह आमतौर पर 32-बिट और 64-बिट बिल्ड के बीच भिन्न होता है)।
यहां तक कि एक ही मशीन पर चलने से चालानों में अलग-अलग परिणाम मिलेंगे:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
जबकि:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
पर्यावरण चर भी देखें PYTHONHASHSEED
:
यदि यह चर सेट या सेट नहीं है random
, तो रैंडम वैल्यू का उपयोग हैश str
, bytes
और datetime
ऑब्जेक्ट्स को बीज करने के लिए किया जाता है ।
यदि PYTHONHASHSEED
पूर्णांक मान पर सेट किया जाता है, तो इसका उपयोग hash()
हैश यादृच्छिकरण द्वारा कवर किए गए प्रकारों को उत्पन्न करने के लिए एक निश्चित बीज के रूप में किया जाता है ।
इसका उद्देश्य दोहराए गए हैशिंग की अनुमति देना है, जैसे कि दुभाषिया के लिए स्वयं के लिए, या हैश के मूल्यों को साझा करने के लिए अजगर प्रक्रियाओं के एक समूह की अनुमति देना।
पूर्णांक श्रेणी में दशमलव संख्या होनी चाहिए [0, 4294967295]
। मान निर्दिष्ट 0
करने से हैश यादृच्छिकरण अक्षम हो जाएगा।
उदाहरण के लिए:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305