Я играл с хеш-функцией Python . Для маленьких целых чисел он появляется hash(n) == n
всегда. Однако это не распространяется на большие числа:
>>> hash(2**100) == 2**100
False
Я не удивлен, я понимаю, что хеш принимает конечный диапазон значений. Что это за диапазон?
Я пробовал использовать двоичный поиск, чтобы найти наименьшее число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
Изменить: я использую Python 3. Я выполнил тот же двоичный поиск на Python 2 и получил другой результат 2147483648, который, как я отмечаю, sys.maxint+1
Я также поиграл, [hash(random.random()) for i in range(10**6)]
чтобы оценить диапазон хэш-функции. Максимальное значение постоянно ниже n выше. Сравнивая min, кажется, что хеш Python 3 всегда положительно оценивается, тогда как хеш Python 2 может принимать отрицательные значения.