Я пытаюсь понять хеш-функцию python под капотом. Я создал пользовательский класс, где все экземпляры возвращают одно и то же значение хэш-функции.
class C(object):
def __hash__(self):
return 42
Я только предположил, что только один экземпляр вышеуказанного класса может быть в наборе в любое время, но на самом деле множество может иметь несколько элементов с одинаковым хешем.
c, d = C(), C()
x = {c: 'c', d: 'd'}
print x
# {<__main__.C object at 0x83e98cc>:'c', <__main__.C object at 0x83e98ec>:'d'}
# note that the dict has 2 elements
Я немного экспериментировал и обнаружил, что если я переопределю метод __eq__
так, чтобы все экземпляры класса сравнивались равными, то набор допускает только один экземпляр.
class D(C):
def __eq__(self, other):
return hash(self) == hash(other)
p, q = D(), D()
y = {p:'p', q:'q'}
print y
# {<__main__.D object at 0x8817acc>]: 'q'}
# note that the dict has only 1 element
Так что мне любопытно узнать, как может dict иметь несколько элементов с одинаковым хэшем. Спасибо!
Примечание. Отредактирован вопрос, чтобы привести пример dict (вместо set), потому что все обсуждения в ответах касаются dicts. Но то же самое относится к наборам; множества также могут иметь несколько элементов с одинаковым значением хеширования.