Hash Python ()

Il metodo hash () restituisce il valore hash di un oggetto se ne ha uno.

I valori hash sono solo numeri interi utilizzati per confrontare rapidamente le chiavi del dizionario durante una ricerca nel dizionario.

Internamente, il hash()metodo chiama il __hash__()metodo di un oggetto che è impostato di default per qualsiasi oggetto. Vedremo questo più tardi.

La sintassi del hash()metodo è:

 hash (oggetto)

Parametri hash ()

hash() metodo accetta un singolo parametro:

  • oggetto - l'oggetto il cui valore hash deve essere restituito (intero, stringa, float)

Valore restituito da hash ()

hash() restituisce il valore hash di un oggetto se ne ha uno.

Se un oggetto ha un __hash__()metodo personalizzato , tronca il valore restituito alla dimensione di Py_ssize_t.

Esempio 1: come funziona hash () in Python?

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

Produzione

 Hash per 181 è: 181 Hash per 181.23 è: 530343892119126197 Hash per Python è: 2230730083538390373 

Esempio 2: hash () per oggetto tupla immutabile?

hash() funziona solo per oggetti immutabili come tupla.

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

Produzione

 L'hash è: -695778075465126279

Come funziona hash () per gli oggetti personalizzati?

Come indicato sopra, il hash()metodo chiama internamente __hash__()metodo. Pertanto, qualsiasi oggetto può sostituire __hash__()i valori hash personalizzati.

Ma per una corretta implementazione dell'hash, __hash__()dovrebbe sempre restituire un numero intero. E, sia __eq__()e __hash__()metodi devono essere attuate.

Di seguito sono riportati i casi per l' __hash__()override corretto .

Casi per l'implementazione dell'hash personalizzato per gli oggetti
__eq __ () __hash __ () Descrizione
Definito (per impostazione predefinita) Definito (per impostazione predefinita) Se lasciato così com'è, tutti gli oggetti si confrontano in modo disuguale (tranne se stessi)
(Se modificabile) Definito Non dovrebbe essere definito L'implementazione della raccolta hashable richiede che il valore hash della chiave sia immutabile
Non definito Non dovrebbe essere definito Se __eq__()non è definito, __hash__()non dovrebbe essere definito.
Definito Non definito Le istanze di classe non saranno utilizzabili come raccolta hashable. __hash __ () implicity impostato su None. Solleva TypeErrorun'eccezione se si tenta di recuperare l'hash.
Definito Trattenere dal genitore __hash__ = .__hash__
Definito Non vuole hashish __hash__ = None. Solleva l'eccezione TypeError se si tenta di recuperare l'hash.

Esempio 3: hash () per oggetti personalizzati sovrascrivendo __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))

Produzione

 L'hash è: 3785419240612877014

Nota: non è necessario implementare il __eq__()metodo per l'hash poiché viene creato per impostazione predefinita per tutti gli oggetti.

Articoli interessanti...