Магический метод __hash__ в Python

Столкнулся с магическим методом hash в ооп в python. В инете и в документации мало примеров этого метода в ооп. Он возвращает число, id объекта. Но зачем он вообще нужен? Если для сравнения, то почему не использовать всем знакомые __ eq __, __ lt __, __ ne __ и т.д.?

def __hash__(self):
    return hash(Point.__repr__(self))

Скажите, что в этом случае возвращает hash?

P.S. Point - класс, в котором прописан метод repr и как раз этот hash.


Ответы (1 шт):

Автор решения: CrazyElf

Даже в Википедии написано достаточно. По сути hash нужен для быстрого сравнения объектов. Это нужно например для словарей, именно за счёт хэша доступ по ключу в словарях так быстро работает. Полное сравнение объектов может работать долго, поэтому сначала сравниваются хэши объектов и только при их совпадении производится полное сравнение через eq. В идеале хэш должен быть с одной стороны небольшой по размеру, а с другой стороны разный для разных объектов. Это не всегда возможно и оправданно, поэтому в реальности хэш это некий компромисс и коллизии всё же бывают, но их немного, поэтому поиск по ключу в словаре и проверка наличия элемента в set работает моментально (за время порядка O(1)).

Детали реализации хэша в Python можно посмотреть в документации по Python (спасибо dIm0n за ссылку).

→ Ссылка