Я играл с 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 может принимать отрицательные значения.