Python-hash ()

Hash () -menetelmä palauttaa objektin hash-arvon, jos sillä on sellainen.

Hash-arvot ovat vain kokonaislukuja, joita käytetään vertaamaan sanakirjaavaimia sanakirjan haun aikana nopeasti.

Sisäisesti hash()method kutsuu __hash__()objektin metodia, joka on oletusarvoisesti asetettu mille tahansa objektille. Katsomme tätä myöhemmin.

Menetelmän syntaksi hash()on:

 hash (objekti)

hash () -parametrit

hash() menetelmä ottaa yhden parametrin:

  • object - objekti, jonka hash-arvo on palautettava (kokonaisluku, merkkijono, kelluva)

Palautusarvo tiivisteestä ()

hash() method palauttaa objektin hash-arvon, jos sillä on sellainen.

Jos objektilla on mukautettu __hash__()menetelmä, se katkaisee palautusarvon Py_ssize_t.

Esimerkki 1: Kuinka hash () toimii Pythonissa?

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

Tuotos

 Hash for 181 on: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373 

Esimerkki 2: hash () muuttumattomalle dupleksiobjektille?

hash() -menetelmä toimii vain muuttumattomien objektien kanssa dupleksinä.

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

Tuotos

 Hajautusarvo on: -695778075465126279

Kuinka hash () toimii mukautetuissa kohteissa?

Kuten edellä todettiin, hash()menetelmä kutsuu sisäisesti __hash__()menetelmää. Joten kaikki objektit voivat ohittaa __hash__()mukautetut hajautusarvot.

Mutta oikean hash-toteutuksen __hash__()tulisi aina palauttaa kokonaisluku. Ja molemmat __eq__()ja __hash__()menetelmät on toteutettava.

Alla on ilmoitettu oikeiden __hash__()ohitusten tapaukset.

Tapaukset kohteiden mukautetulle hash-toteutukselle
__eq __ () __hash __ () Kuvaus
Määritelty (oletuksena) Määritelty (oletuksena) Jos jätetään sellaisenaan, kaikki objektit vertailevat eriarvoisuutta (paitsi itse)
(Jos muutettavissa) Määritelty Ei pitäisi määritellä Hajautettavan kokoelman toteuttaminen edellyttää, että avaimen hajautusarvo on muuttumaton
Ei määritelty Ei pitäisi määritellä Jos sitä __eq__()ei ole määritelty, __hash__()sitä ei pitäisi määritellä.
Määritelty Ei määritelty Luokan esiintymiä ei voi käyttää hajautettavana kokoelmana. __hash __ () implisiitti asetettu arvoon None. Lisää TypeErrorpoikkeuksen, jos yritetään noutaa hash.
Määritelty Säilytä vanhemmilta __hash__ = .__hash__
Määritelty Ei halua hajauttaa __hash__ = None. Korottaa TypeError-poikkeuksen, jos yritetään noutaa hash.

Esimerkki 3: Hajautus () mukautetuille objekteille korvaamalla __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))

Tuotos

 Hajautusarvo on: 3785419240612877014

Huomaa: Sinun ei tarvitse ottaa käyttöön __eq__()hash-menetelmää, koska se luodaan oletusarvoisesti kaikille kohteille.

Mielenkiintoisia artikkeleita...