Metoda hash () vraća hash vrijednost objekta ako ga ima.
Hash vrijednosti su samo cjelobrojne vrijednosti koje se koriste za brzo uspoređivanje ključeva rječnika tijekom pretraživanja rječnika.
Interno hash()metoda poziva __hash__()metodu objekta koja je zadana za bilo koji objekt. Ovo ćemo pogledati kasnije.
Sintaksa hash()metode je:
hash (objekt)
parametri hash ()
hash() metoda uzima jedan parametar:
- objekt - objekt čija se hash vrijednost treba vratiti (cijeli broj, niz, float)
Povratna vrijednost iz hasha ()
hash() metoda vraća hash vrijednost objekta ako ga ima.
Ako objekt ima prilagođenu __hash__()metodu, on skraćuje povratnu vrijednost na veličinu Py_ssize_t.
Primjer 1: Kako hash () djeluje u Pythonu?
# 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'))
Izlaz
Hash za 181 je: 181 Hash za 181.23 je: 530343892119126197 Hash za Python je: 2230730083538390373
Primjer 2: hash () za nepromjenjivi objekt korice?
hash() metoda djeluje samo za nepromjenjive objekte kao skup.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Izlaz
Hash je: -695778075465126279
Kako hash () djeluje za prilagođene objekte?
Kao što je gore rečeno, hash()metoda interno poziva __hash__()metodu. Dakle, bilo koji objekti mogu nadjačati __hash__()prilagođene hash vrijednosti.
Ali za ispravnu implementaciju hasha, __hash__()uvijek treba vratiti cijeli broj. I, __eq__()i __hash__()metode i metode moraju se primijeniti.
Ispod su slučajevi za ispravno __hash__()poništavanje.
| __eq __ () | __hash __ () | Opis |
|---|---|---|
| Definirano (prema zadanim postavkama) | Definirano (prema zadanim postavkama) | Ako se ostave takvi kakvi jesu, svi se objekti uspoređuju nejednako (osim sebe) |
| (Ako je promjenjivo) Definirano | Ne treba definirati | Provedba hashable kolekcije zahtijeva da hash vrijednost ključa bude nepromjenjiva |
| Nije definirano | Ne treba definirati | Ako __eq__()nije definirano, __hash__()ne bi ga trebalo definirati. |
| Definirano | Nije definirano | Primjeri klase neće biti upotrebljivi kao raspršiva zbirka. __hash __ () implikacija postavljena na None. Povećava TypeErroriznimku ako se pokuša dohvatiti hash. |
| Definirano | Zadrži od roditelja | __hash__ = .__hash__ |
| Definirano | Ne želi hashirati | __hash__ = None. Povećava iznimku TypeError ako se pokuša dohvatiti hash. |
Primjer 3: hash () za prilagođene objekte nadjačavanjem __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))
Izlaz
Hash je: 3785419240612877014
Napomena: Ne morate implementirati __eq__()metodu za raspršivanje jer je prema zadanim postavkama stvorena za sve objekte.








