Je essaie de comprendre la fonction Python hash
sous le capot. J'ai créé une classe personnalisée où toutes les instances retournent la même valeur de hash.
class C:
def __hash__(self):
return 42
J'ai juste supposé qu'une seule instance de la classe ci-dessus peut être dans un dict
à tout moment, mais en fait un dict
peut avoir plusieurs éléments avec le même hash.
c, d = C(), C()
x = {c: 'c', d: 'd'}
print(x)
# {<__main__.C object at 0x7f0824087b80>: 'c', <__main__.C object at 0x7f0823ae2d60>: 'd'}
# notez que le dict a 2 éléments
J'ai expérimenté un peu plus et j'ai trouvé que si je redéfinis la méthode __eq__
de telle sorte que toutes les instances de la classe se comparent égales, alors le dict
n'autorise qu'une seule instance.
class D:
def __hash__(self):
return 42
def __eq__(self, other):
return True
p, q = D(), D()
y = {p: 'p', q: 'q'}
print(y)
# {<__main__.D object at 0x7f0823a9af40>: 'q'}
# notez que le dict a seulement 1 élément
Je suis curieux de savoir comment un dict
peut avoir plusieurs éléments avec le même hash.
3 votes
Comme vous l'avez découvert vous-même, les ensembles et les dictionnaires peuvent contenir plusieurs objets ayant des hachages égaux si les objets eux-mêmes ne sont pas égaux. Que demandez-vous ? Comment fonctionnent les tables ? C'est une question assez générale avec beaucoup de matériel existant...
0 votes
@delnan Je pensais davantage à cela après avoir posté la question ; que ce comportement ne peut pas être restreint à Python. Et vous avez raison. Je suppose que je devrais approfondir mes connaissances sur la littérature générale des tables de hashage. Merci.