В CPython, реализация интерпретатора Python по умолчанию, встроенная hash
выполняется в таким образом :
Для числовых типов хеш числа x основан на сокращении
x по модулю простого числа P = 2 ** _ PyHASH_BITS - 1. Он разработан таким образом, чтобы
hash (x) == hash (y) всякий раз, когда x и y численно равны, даже если
х и у имеют разные типы
_PyHASH_BITS
- это 61
(64-разрядные системы) или 31
(32-разрядные системы) (здесь определено )
Итак, в 64-битной системе встроенная hash
выглядит следующим образом:
def hash(number):
return number % (2 ** 61 - 1)
Именно поэтому для небольших целых значений вы получаете одинаковые значения, в то время как, например, hash(2305843009213693950)
возвращает 2305843009213693950
и hash(2305843009213693951)
возвращает 0