Hachage Python ()

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 .

Cas d'implémentation de hachage personnalisé pour les objets
__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 TypeErrorexception 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.

Articles intéressants...