Ho giocato con la funzione hash di Python . Per i piccoli numeri interi, appare hash(n) == n
sempre. Tuttavia questo non si estende a grandi numeri:
>>> hash(2**100) == 2**100
False
Non sono sorpreso, capisco che l'hash abbia una gamma finita di valori. Qual è questo intervallo?
Ho provato a utilizzare la ricerca binaria per trovare il numero più piccolohash(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
Cos'ha di speciale 2305843009213693951? Noto che è meno disys.maxsize == 9223372036854775807
Modifica: sto usando Python 3. Ho eseguito la stessa ricerca binaria su Python 2 e ho ottenuto un risultato diverso 2147483648, che noto è sys.maxint+1
Ho anche giocato con [hash(random.random()) for i in range(10**6)]
per stimare la gamma della funzione hash. Il massimo è costantemente inferiore a n sopra. Confrontando il min, sembra che l'hash di Python 3 sia sempre valutato positivamente, mentre l'hash di Python 2 può assumere valori negativi.
n+1 == 2**61-1
n
per l'intero intervallo int a 64 bit.
2147483647
uguale a sys.maxint
(non sys.maxint+1
) e se "n = 0b1111111111111111111111111111111111111111111111111111111111111" non è n+1 == 2**61
o n == 2**61-1
(no n+1 == 2**61-1
)?