Bawiłem się funkcją skrótu Pythona . W przypadku małych liczb całkowitych pojawia się hash(n) == n
zawsze. Jednak nie dotyczy to dużych liczb:
>>> hash(2**100) == 2**100
False
Nie dziwię się, rozumiem, że hash przyjmuje skończony zakres wartości. Co to za zasięg?
Próbowałem użyć wyszukiwania binarnego, aby znaleźć najmniejszą liczbę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
Co jest specjalnego w 2305843009213693951? Zauważam, że to mniej niżsys.maxsize == 9223372036854775807
Edycja: używam Pythona 3. Przeprowadziłem to samo wyszukiwanie binarne w Pythonie 2 i otrzymałem inny wynik 2147483648, który, jak zauważam, to sys.maxint+1
Bawiłem się też, [hash(random.random()) for i in range(10**6)]
aby oszacować zakres funkcji skrótu. Maksimum jest konsekwentnie poniżej n powyżej. Porównując min, wydaje się, że hash Pythona 3 jest zawsze pozytywnie oceniany, podczas gdy hash Pythona 2 może przyjmować wartości ujemne.