हैश () पद्धति किसी वस्तु के हैश मान को लौटा देती है यदि उसमें एक है।
हैश मान केवल पूर्णांक हैं जिनका उपयोग शब्दकोश कुंजियों की तुलना शब्दकोश की खोज के दौरान जल्दी से करने के लिए किया जाता है।
आंतरिक रूप से, hash()
विधि __hash__()
किसी वस्तु की विधि कहलाती है जो किसी भी वस्तु के लिए डिफ़ॉल्ट रूप से निर्धारित होती है। हम इसे बाद में देखेंगे।
hash()
विधि का सिंटैक्स है:
हैश (वस्तु)
हैश () पैरामीटर
hash()
विधि एक एकल पैरामीटर लेता है:
- ऑब्जेक्ट - वह वस्तु जिसका हैश मान लौटाया जाना है (पूर्णांक, स्ट्रिंग, फ्लोट)
हैश से वापसी मूल्य ()
hash()
विधि किसी वस्तु का हैश मान लौटाती है यदि वह एक है।
यदि किसी ऑब्जेक्ट में कस्टम __hash__()
विधि है, तो यह आकार के लिए वापसी मान को कम कर देता है Py_ssize_t
।
उदाहरण 1: हैथ () पायथन में कैसे काम करता है?
# hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))
आउटपुट
181 के लिए हैश है: 181.23 के लिए 181 हैश है: 530343892119126197 पायथन के लिए हैश है: 2230730083538390373
उदाहरण 2: हैश () अपरिवर्तनीय टपल ऑब्जेक्ट के लिए?
hash()
पद्धति केवल तुक के रूप में अपरिवर्तनीय वस्तुओं के लिए काम करती है।
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
आउटपुट
हैश है: -695778075465126279
कस्टम वस्तुओं के लिए हैश () कैसे काम करता है?
जैसा कि ऊपर कहा गया है, hash()
विधि आंतरिक रूप से विधि कहती __hash__()
है। इसलिए, कोई भी वस्तु __hash__()
कस्टम हैश मानों के लिए ओवरराइड कर सकती है ।
लेकिन सही हैश कार्यान्वयन के लिए, __hash__()
हमेशा पूर्णांक वापस करना चाहिए। और, दोनों तरीकों __eq__()
और __hash__()
तरीकों को लागू करना होगा।
नीचे सही __hash__()
ओवरराइड के मामले हैं।
__eq __ () | __हाश __ () | विवरण |
---|---|---|
परिभाषित (डिफ़ॉल्ट रूप से) | परिभाषित (डिफ़ॉल्ट रूप से) | यदि छोड़ दिया जाता है, तो सभी वस्तुएं असमान की तुलना करती हैं (खुद को छोड़कर) |
(यदि उत्परिवर्तित) परिभाषित है | परिभाषित नहीं किया जाना चाहिए | धोने योग्य संग्रह के कार्यान्वयन के लिए महत्वपूर्ण हैश मूल्य अपरिवर्तनीय होना चाहिए |
परिभाषित नहीं | परिभाषित नहीं किया जाना चाहिए | यदि __eq__() परिभाषित नहीं किया गया है, तो परिभाषित नहीं किया __hash__() जाना चाहिए। |
परिभाषित | परिभाषित नहीं | वर्ग उदाहरण हैशेबल संग्रह के रूप में उपयोग करने योग्य नहीं होंगे। __hash __ () की आबद्धता None । TypeError यदि हैश को पुनः प्राप्त करने का प्रयास किया जाता है तो अपवाद को उठाता है। |
परिभाषित | जनक से लिया हुआ | __hash__ = .__hash__ |
परिभाषित | हैश नहीं करना चाहता | __hash__ = None । यदि हैश को पुनः प्राप्त करने का प्रयास किया जाता है तो TypeError अपवाद उठाएं। |
उदाहरण 3: हैश () कस्टम ऑब्जेक्ट्स के लिए __hash __ () ओवरराइड करके
class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
आउटपुट
हैश है: 3785419240612877014
नोट: आपको __eq__()
हैश के लिए विधि लागू करने की आवश्यकता नहीं है क्योंकि यह सभी वस्तुओं के लिए डिफ़ॉल्ट रूप से बनाया गया है।