La méthode hash () renvoie la valeur de hachage d'un objet s'il en a une.
Les valeurs de hachage ne sont que des entiers utilisés pour comparer rapidement les clés du dictionnaire lors d'une recherche dans le dictionnaire.
En interne, la hash()
méthode appelle la __hash__()
méthode d'un objet qui est défini par défaut pour n'importe quel objet. Nous examinerons cela plus tard.
La syntaxe de la hash()
méthode est:
hash (objet)
Paramètres de hash ()
hash()
La méthode prend un seul paramètre:
- object - l'objet dont la valeur de hachage doit être renvoyée (entier, chaîne, flottant)
Valeur renvoyée par hash ()
hash()
La méthode renvoie la valeur de hachage d'un objet s'il en a une.
Si un objet a une __hash__()
méthode personnalisée , il tronque la valeur de retour à la taille de Py_ssize_t
.
Exemple 1: Comment fonctionne hash () en 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'))
Production
Hash pour 181 est: 181 Hash pour 181,23 est: 530343892119126197 Hash pour Python est: 2230730083538390373
Exemple 2: hash () pour un objet tuple immuable?
hash()
La méthode ne fonctionne que pour les objets immuables en tant que tuple.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Production
Le hachage est: -695778075465126279
Comment fonctionne hash () pour les objets personnalisés?
Comme indiqué ci-dessus, hash()
method appelle en interne __hash__()
method. Ainsi, tous les objets peuvent remplacer __hash__()
les valeurs de hachage personnalisées.
Mais pour une implémentation correcte du hachage, __hash__()
doit toujours retourner un entier. Et, à la fois __eq__()
et les __hash__()
méthodes doivent être mises en œuvre.
Vous trouverez ci-dessous les cas de __hash__()
remplacement correct .
__eq __ () | __hacher__() | La description |
---|---|---|
Défini (par défaut) | Défini (par défaut) | Si laissé tel quel, tous les objets se comparent de manière inégale (sauf eux-mêmes) |
(Si mutable) Défini | Ne devrait pas être défini | La mise en œuvre de la collection hachable nécessite que la valeur de hachage de la clé soit immuable |
Non défini | Ne devrait pas être défini | Si __eq__() n'est pas défini, __hash__() ne doit pas être défini. |
Défini | Non défini | Les instances de classe ne seront pas utilisables comme collection hachables. Implicité __hash __ () définie sur None . Déclenche une TypeError exception en cas de tentative de récupération du hachage. |
Défini | Retenir du parent | __hash__ = .__hash__ |
Défini | Ne veut pas hacher | __hash__ = None . Déclenche une exception TypeError en cas de tentative de récupération du hachage. |
Exemple 3: hash () pour les objets personnalisés en remplaçant __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))
Production
Le hachage est: 3785419240612877014
Remarque: vous n'avez pas à implémenter la __eq__()
méthode pour le hachage car il est créé par défaut pour tous les objets.