He estado jugando con la función hash de Python . Para enteros pequeños, aparece hash(n) == n
siempre. Sin embargo, esto no se extiende a grandes cantidades:
>>> hash(2**100) == 2**100
False
No me sorprende, entiendo que el hash toma un rango finito de valores. ¿Cuál es ese rango?
Intenté usar la búsqueda binaria para encontrar el número más pequeñohash(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
¿Qué tiene de especial 2305843009213693951? Noto que es menos desys.maxsize == 9223372036854775807
Editar: estoy usando Python 3. Ejecuté la misma búsqueda binaria en Python 2 y obtuve un resultado diferente 2147483648, que noto es sys.maxint+1
También jugué [hash(random.random()) for i in range(10**6)]
para estimar el rango de la función hash. El máximo está constantemente por debajo de n por encima. Comparando el mínimo, parece que el hash de Python 3 siempre se valora positivamente, mientras que el hash de Python 2 puede tomar valores negativos.
n+1 == 2**61-1
n
para todo el rango int de 64 bits.
2147483647
igual a sys.maxint
(no sys.maxint+1
), y si 'n = 0b111111111111111111111111111111111111111111111111111111111' entonces no es n+1 == 2**61
o n == 2**61-1
(no n+1 == 2**61-1
)?