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 .
__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 TypeError un'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.