Я играл с Python hash function. Для маленьких целых чисел всегда отображается hash(n) == n
. Однако это не распространяется на большие числа:Когда hash (n) == n в Python?
>>> hash(2**100) == 2**100
False
Я не удивлен, я понимаю, что хэш принимает конечный диапазон значений. Что это за диапазон?
Я попытался с помощью binary search найти наименьшее число hash(n) != n
>>> import codejamhelpers # pip install codejamhelpers
>>> help(codejamhelpers.binary_search)
Help on function binary_search in module codejamhelpers.binary_search:
binary_search(f, t)
Given an increasing function :math:`f`, find the greatest non-negative integer :math:`n` such that :math:`f(n) \le t`. If :math:`f(n) > t` for all :math:`n \ge 0`, return None.
>>> f = lambda n: int(hash(n) != n)
>>> n = codejamhelpers.binary_search(f, 0)
>>> hash(n)
2305843009213693950
>>> hash(n+1)
0
Что особенного 2305843009213693951? Отмечу, что это меньше, чем sys.maxsize == 9223372036854775807
Edit: Я использую Python 3. Я запускал тот же самый бинарный поиск на Python 2 и получил другой результат 2147483648, который я отмечаю это sys.maxint+1
Я также играл с в оценить диапазон хэш-функции. Максимум последовательно ниже n выше. Сравнивая min, кажется, что хеш Python 3 всегда положительно оценивается, тогда как хэш Python 2 может принимать отрицательные значения.
Проверили вы бинарное представление этого числа? –
'0b111111111111111111111111111111111111111111111111111111111111111' любопытно! Поэтому 'n + 1 == 2 ** 61-1' –
, похоже, зависит от системы. С моим python хэш является 'n' для всего 64-битного диапазона int. – Daniel