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