Python hash ()

Metóda hash () vracia hashovaciu hodnotu objektu, ak ho má.

Hodnoty hash sú iba celé čísla, ktoré sa používajú na rýchle porovnanie kľúčov slovníka počas rýchleho vyhľadávania slovníka.

hash()Metóda interne volá __hash__()metódu objektu, ktorá je predvolene nastavená pre akýkoľvek objekt. Pozrime sa na to neskôr.

Syntax hash()metódy je:

 hash (objekt)

hash () parametre

hash() metóda má jediný parameter:

  • object - objekt, ktorého hash hodnota sa má vrátiť (integer, string, float)

Vrátiť hodnotu z hash ()

hash() metóda vráti hashovaciu hodnotu objektu, ak ho má.

Ak má objekt vlastnú __hash__()metódu, skráti návratovú hodnotu na veľkosť Py_ssize_t.

Príklad 1: Ako funguje hash () v Pythone?

 # 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'))

Výkon

 Hash pre 181 je: 181 Hash pre 181.23 je: 530343892119126197 Hash pre Python je: 2230730083538390373 

Príklad 2: hash () pre nemenný objekt n-tice?

hash() metóda funguje iba pre nemenné objekty ako n-tica.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Výkon

 Hodnota hash je: -695778075465126279

Ako funguje hash () pre vlastné objekty?

Ako je uvedené vyššie, hash()metóda interne volá __hash__()metódu. Takže akékoľvek objekty môžu prepísať __hash__()vlastné hodnoty hash.

Ale pre správnu implementáciu hash __hash__()by mal vždy vrátiť celé číslo. A, ako __eq__()a __hash__()majú metódy, ktoré majú byť realizované.

Nižšie uvádzame prípady správneho __hash__()prepísania.

Prípady implementácie vlastného hash pre objekty
__eq __ () __hash __ () Popis
Definované (predvolené) Definované (predvolené) Ak sú ponechané tak, ako sú, všetky objekty sa porovnávajú nerovnako (okrem seba)
(Ak je premenlivý) Definované Nemalo by byť definované Implementácia hašovateľného zberu vyžaduje, aby bola hašovacia hodnota kľúča nemenná
Nie je definované Nemalo by byť definované Ak __eq__()nie je definované, __hash__()nemalo by sa definovať.
Definovaný Nie je definované Inštancie triedy nebudú použiteľné ako hašovateľná zbierka. __hash __ () implicita nastavená na None. Pri TypeErrorpokuse o načítanie hash vyvolá výnimku.
Definovaný Zachovať od rodiča __hash__ = .__hash__
Definovaný Nechce hash __hash__ = None. Pri pokuse o načítanie hodnoty hash vyvolá výnimku TypeError.

Príklad 3: hash () pre vlastné objekty prepísaním __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))

Výkon

 Hodnota hash je: 3785419240612877014

Poznámka: Nemusíte implementovať __eq__()metódu pre hash, pretože je štandardne vytváraný pre všetky objekty.

Zaujímavé články...