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ă .
__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 TypeError excepț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.