Я пытаюсь понять хэш-функцию 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 (вместо set), потому что все обсуждения в ответах посвящены dicts. Но то же самое относится и к сетам; наборы также могут иметь несколько элементов с одинаковым значением хеш-функции.