Я грав з хеш-функцією 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 вище. Порівнюючи мінус, здається, хеш Python 3 завжди оцінюється позитивно, тоді як хеш Python 2 може приймати негативні значення.
n+1 == 2**61-1
n
для всього діапазону 64-бітових int.
2147483647
дорівнює sys.maxint
(не sys.maxint+1
), і якщо 'n = 0b1111111111111111111111111111111111111111111111111111111111111', то це не ( n+1 == 2**61
або n == 2**61-1
ні n+1 == 2**61-1
)?