Python hash ()

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.

Slučajevi za prilagođenu hash implementaciju za objekte
__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.

Zanimljivi članci...