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 TypeErroruitzondering 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.








