Python-hash ()

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.

Cases voor aangepaste hash-implementatie voor objecten
__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.

Interessante artikelen...