Python hash ()

Metoden hash () returnerer hash-værdien af ​​et objekt, hvis det har et.

Hash-værdier er bare heltal, der bruges til at sammenligne ordbogstaster hurtigt under en ordbogsopslag.

Internt hash()kalder __hash__()metoden metode til et objekt, der som standard er indstillet til ethvert objekt. Vi ser på det senere.

Syntaksen for hash()metoden er:

 hash (objekt)

hash () Parametre

hash() metoden tager en enkelt parameter:

  • objekt - det objekt, hvis hash-værdi skal returneres (heltal, streng, float)

Returneringsværdi fra hash ()

hash() metoden returnerer hash-værdien af ​​et objekt, hvis det har en.

Hvis et objekt har en tilpasset __hash__()metode, afkortes returværdien til størrelsen på Py_ssize_t.

Eksempel 1: Hvordan fungerer 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 for 181 er: 181 Hash for 181,23 er: 530343892119126197 Hash for Python er: 2230730083538390373 

Eksempel 2: hash () til uforanderlig tupleobjekt?

hash() metoden fungerer kun for uforanderlige objekter som tuple.

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

Produktion

 Hashet er: -695778075465126279

Hvordan fungerer hash () til brugerdefinerede objekter?

Som nævnt ovenfor hash()kalder __hash__()metoden internt metoden. Så alle objekter kan tilsidesættes __hash__()for brugerdefinerede hash-værdier.

Men for korrekt hash-implementering __hash__()skal det altid returnere et heltal. Og både __eq__()og __hash__()metoder skal implementeres.

Nedenfor er tilfældene for korrekt __hash__()tilsidesættelse.

Tilfælde til implementering af brugerdefineret hash til objekter
__eq __ () __hash __ () Beskrivelse
Defineret (som standard) Defineret (som standard) Hvis de forbliver som de er, sammenligner alle objekter ulige (undtagen dem selv)
(Hvis det kan ændres) Defineret Bør ikke defineres Implementering af hashable-indsamling kræver, at nøgles hash-værdi er uforanderlig
Ikke defineret Bør ikke defineres Hvis __eq__()ikke er defineret, __hash__()skal det ikke defineres.
Defineret Ikke defineret Klasseinstanser kan ikke bruges som hashable-samling. __hash __ () implicitet indstillet til None. Hæver TypeErrorundtagelse, hvis det forsøges at hente hashen.
Defineret Behold fra forælder __hash__ = .__hash__
Defineret Vil ikke hash __hash__ = None. Hæver TypeError-undtagelsen, hvis den forsøges at hente hashen.

Eksempel 3: hash () til brugerdefinerede objekter ved at tilsidesætte __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 er: 3785419240612877014

Bemærk: Du behøver ikke implementere __eq__()metoden til hashen, da den oprettes som standard for alle objekter.

Interessante artikler...