Как Python dict может иметь несколько ключей с одним и тем же хешем?

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

79
задан Praveen Gollakota 26 January 2012 в 19:21
поделиться