Python-hash ()

Metoden hash () returnerar hashvärdet för ett objekt om det har ett.

Hash-värden är bara heltal som används för att jämföra ordbokstangenter under en ordbokssökning snabbt.

Internt hash()anropar __hash__()metoden metod för ett objekt som är inställt som standard för något objekt. Vi tittar på det senare.

Syntaxen för hash()metoden är:

 hash (objekt)

hash () Parametrar

hash() metoden tar en enda parameter:

  • objekt - objektet vars hashvärde ska returneras (heltal, sträng, flyt)

Returvärde från hash ()

hash() metoden returnerar hashvärdet för ett objekt om det har ett.

Om ett objekt har anpassad __hash__()metod avkortas returvärdet till storleken på Py_ssize_t.

Exempel 1: Hur fungerar hash () i 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'))

Produktion

 Hash för 181 är: 181 Hash för 181,23 är: 530343892119126197 Hash för Python är: 2230730083538390373 

Exempel 2: hash () för oföränderligt tupelobjekt?

hash() metoden fungerar bara för oföränderliga föremål som tuple.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Produktion

 Hashet är: -695778075465126279

Hur fungerar hash () för anpassade objekt?

Som anges ovan hash()kallar __hash__()metoden internt metoden. Så alla objekt kan åsidosättas __hash__()för anpassade hash-värden.

Men för korrekt hashimplementering, __hash__()ska alltid returnera ett heltal. Och både __eq__()och __hash__()metoder måste implementeras.

Nedan följer fallen för korrekt __hash__()åsidosättning.

Fall för anpassad hashimplementering för objekt
__eq __ () __hash__() Beskrivning
Definierad (som standard) Definierad (som standard) Om det lämnas som det är, jämför alla objekt ojämnt (utom sig själva)
(Om muterbar) Definierad Bör inte definieras Implementering av hashable-insamling kräver att nyckelns hash-värde är oföränderligt
Inte definierad Bör inte definieras Om __eq__()inte är definierat, __hash__()bör inte definieras.
Definierad Inte definierad Klassinstanser kan inte användas som hashable-samling. __hash __ () implicitet inställd på None. Ökar TypeErrorundantaget om du försöker hämta hash.
Definierad Behåll från föräldern __hash__ = .__hash__
Definierad Vill inte hash __hash__ = None. Höjer TypeError-undantaget om du försöker hämta hash.

Exempel 3: hash () för anpassade objekt genom att åsidosätta __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))

Produktion

 Hashet är: 3785419240612877014

Obs! Du behöver inte implementera __eq__()metoden för hash eftersom den skapas som standard för alla objekt.

Intressanta artiklar...