Tenho brincado com a função hash do Python . Para números inteiros pequenos, aparece hash(n) == n
sempre. No entanto, isso não se estende a grandes números:
>>> hash(2**100) == 2**100
False
Não estou surpreso, entendo que o hash assume uma faixa finita de valores. Qual é esse alcance?
Tentei usar a pesquisa binária para encontrar o menor númerohash(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
O que há de especial em 2305843009213693951? Eu noto que é menos quesys.maxsize == 9223372036854775807
Edit: Estou usando Python 3. Eu executei a mesma pesquisa binária no Python 2 e obtive um resultado diferente 2147483648, que observo é sys.maxint+1
Eu também brinquei com [hash(random.random()) for i in range(10**6)]
para estimar o intervalo da função hash. O máximo está consistentemente abaixo de n acima. Comparando o min, parece que o hash do Python 3 é sempre valorizado positivamente, enquanto o hash do Python 2 pode assumir valores negativos.
n+1 == 2**61-1
n
para todo o intervalo int de 64 bits.
2147483647
igual a sys.maxint
(não sys.maxint+1
) e se 'n = 0b11111111111111111111111111111111111111111111111111111111111111111' então não é n+1 == 2**61
ou n == 2**61-1
(não n+1 == 2**61-1
)?