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