Python hash ()

Metoda hash () returnează valoarea hash a unui obiect dacă are unul.

Valorile hash sunt doar numere întregi care sunt folosite pentru a compara rapid cheile de dicționar în timpul unei căutări de dicționar.

Pe plan intern, hash()metoda apelează __hash__()metoda unui obiect care este setat implicit pentru orice obiect. Ne vom uita la asta mai târziu.

Sintaxa hash()metodei este:

 hash (obiect)

hash () Parametri

hash() metoda ia un singur parametru:

  • obiect - obiectul a cărui valoare hash trebuie returnată (întreg, șir, float)

Returnează valoarea din hash ()

hash() metoda returnează valoarea hash a unui obiect dacă are unul.

Dacă un obiect are o __hash__()metodă personalizată , trunchiază valoarea returnată la dimensiunea Py_ssize_t.

Exemplul 1: Cum funcționează hash () în 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'))

Ieșire

 Hash pentru 181 este: 181 Hash pentru 181.23 este: 530343892119126197 Hash pentru Python este: 2230730083538390373 

Exemplul 2: hash () pentru obiectul tău imuabil?

hash() metoda funcționează numai pentru obiecte imuabile ca tuplu.

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

Ieșire

 Hash-ul este: -695778075465126279

Cum funcționează hash () pentru obiecte personalizate?

După cum sa menționat mai sus, hash()metoda apelează intern __hash__()metoda. Deci, orice obiect poate suprascrie __hash__()pentru valorile hash personalizate.

Dar pentru implementarea corectă a hash-ului, __hash__()trebuie întotdeauna să returnăm un număr întreg. Și, ambele __eq__()și __hash__()metodele trebuie implementate.

Mai jos sunt cazurile pentru __hash__()suprascriere corectă .

Cazuri pentru implementare hash personalizată pentru obiecte
__eq __ () __hash __ () Descriere
Definit (implicit) Definit (implicit) Dacă sunt lăsate ca atare, toate obiectele se compară inegal (cu excepția lor)
(Dacă se poate modifica) Definit Nu trebuie definit Implementarea colecției hashable necesită ca valoarea hash a cheii să fie imuabilă
Nedefinit Nu trebuie definit Dacă __eq__()nu este definit, __hash__()nu ar trebui definit.
Definit Nedefinit Instanțele de clasă nu vor putea fi utilizate ca colecție lavabilă. __hash __ () implicit setat la None. Crește TypeErrorexcepția dacă se încearcă recuperarea hashului.
Definit Păstrați de la părinte __hash__ = .__hash__
Definit Nu vrea să hash __hash__ = None. Creează excepția TypeError dacă se încearcă recuperarea hashului.

Exemplul 3: hash () pentru obiecte personalizate prin suprascrierea __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))

Ieșire

 Hash-ul este: 3785419240612877014

Notă: Nu trebuie să implementați __eq__()metoda pentru hash, deoarece este creată implicit pentru toate obiectele.

Articole interesante...