A необходимое условие для хешируемости состоит в том, что для эквивалентных объектов это значение равно всегда одинаково ( внутри одного прогона интерпретатора ).
Конечно, ничто не мешает вам игнорировать это требование. Но если вы вдруг захотите сохранить свои объекты в словаре или наборе, то могут возникнуть проблемы.
Когда вы реализуете свой собственный класс, вы можете определить методы __eq__
и __hash__
. Я использовал полиноминальную хеш-функцию для строк и хеш-функцию из универсального семейства хеш-функций.
Как правило, значения хеш-функции для конкретного объекта не должны изменяться от начала к началу интерпретатора. Но для многих типов данных это действительно так. Одна из причин этой реализации заключается в том, что сложнее найти и проверку на хеш.
Например:
Для числовых типов хеш числа x
основан на уменьшении x
по модулю простого P = 2**_PyHASH_BITS - 1
. Он спроектирован так, что hash(x) == hash(y)
всякий раз, когда x
и y
численно равны, даже если x
и y
имеют разные типы.
a = 123456789
hash(a) == 123456789
hash(a + b * (2 ** 61 - 1)) == 123456789