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 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.








