De hash () methode retourneert de hash-waarde van een object als het er een heeft.
Hash-waarden zijn slechts gehele getallen die worden gebruikt om woordenboeksleutels snel te vergelijken tijdens het opzoeken van een woordenboek.
Intern hash()
roept __hash__()
methode de methode aan van een object dat standaard is ingesteld voor elk object. We zullen hier later naar kijken.
De syntaxis van hash()
methode is:
hash (object)
hash () Parameters
hash()
methode heeft een enkele parameter:
- object - het object waarvan de hash-waarde moet worden geretourneerd (integer, string, float)
Retourwaarde van hash ()
hash()
methode retourneert de hash-waarde van een object als het er een heeft.
Als een object een aangepaste __hash__()
methode heeft, wordt de retourwaarde afgekapt tot de grootte van Py_ssize_t
.
Voorbeeld 1: hoe werkt hash () in Python?
# 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'))
Uitvoer
Hash voor 181 is: 181 Hash voor 181.23 is: 530343892119126197 Hash voor Python is: 2230730083538390373
Voorbeeld 2: hash () voor onveranderlijk tuple-object?
hash()
methode werkt alleen voor onveranderlijke objecten als tuple.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Uitvoer
De hash is: -695778075465126279
Hoe werkt hash () voor aangepaste objecten?
Zoals hierboven vermeld, hash()
roept __hash__()
methode intern method aan. Alle objecten kunnen dus __hash__()
aangepaste hash-waarden overschrijven .
Maar voor een correcte hash-implementatie, __hash__()
moet altijd een geheel getal worden geretourneerd. En, zowel __eq__()
en __hash__()
methoden moeten worden geïmplementeerd.
Hieronder staan de gevallen voor de juiste __hash__()
opheffing.
__eq __ () | __hash __ () | Omschrijving |
---|---|---|
Gedefinieerd (standaard) | Gedefinieerd (standaard) | Indien gelaten zoals ze zijn, vergelijken alle objecten ongelijk (behalve zichzelf) |
(Indien veranderlijk) Gedefinieerd | Moet niet worden gedefinieerd | Implementatie van hash-verzameling vereist dat de hash-waarde van de sleutel onveranderlijk is |
Niet gedefinieerd | Moet niet worden gedefinieerd | Indien __eq__() niet gedefinieerd, __hash__() mag niet worden gedefinieerd. |
Bepaald | Niet gedefinieerd | Klasse-instanties zijn niet bruikbaar als hash-verzameling. __hash __ () impliciteit ingesteld op None . Geeft een TypeError uitzondering als wordt geprobeerd de hash op te halen. |
Bepaald | Bewaar van ouder | __hash__ = .__hash__ |
Bepaald | Wil niet hasjen | __hash__ = None . Geeft de uitzondering TypeError als geprobeerd wordt de hash op te halen. |
Voorbeeld 3: hash () voor aangepaste objecten door __hash __ () te overschrijven
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))
Uitvoer
De hash is: 3785419240612877014
Opmerking: u hoeft geen __eq__()
methode te implementeren voor de hash, aangezien deze standaard voor alle objecten wordt gemaakt.