Ich habe mit Pythons Hash-Funktion gespielt . Bei kleinen Ganzzahlen wird es hash(n) == n
immer angezeigt . Dies erstreckt sich jedoch nicht auf große Zahlen:
>>> hash(2**100) == 2**100
False
Ich bin nicht überrascht, ich verstehe, dass Hash einen endlichen Wertebereich hat. Was ist das für ein Bereich?
Ich habe versucht, mithilfe der binären Suche die kleinste Zahl zu findenhash(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
Was ist das Besondere an 2305843009213693951? Ich stelle fest, es ist weniger alssys.maxsize == 9223372036854775807
Bearbeiten: Ich verwende Python 3. Ich habe die gleiche binäre Suche in Python 2 ausgeführt und ein anderes Ergebnis 2147483648 erhalten, das ich notiere sys.maxint+1
Ich habe auch mit gespielt [hash(random.random()) for i in range(10**6)]
, um den Bereich der Hash-Funktion abzuschätzen. Das Maximum liegt konstant unter n über. Wenn man die min vergleicht, scheint der Hash von Python 3 immer positiv bewertet zu sein, während der Hash von Python 2 negative Werte annehmen kann.
n+1 == 2**61-1
n
für den gesamten 64-Bit-Int-Bereich.
2147483647
gleich sys.maxint
(nicht sys.maxint+1
), und wenn 'n = 0b1111111111111111111111111111111111111111111111111111111111111111' dann nicht n+1 == 2**61
oder n == 2**61-1
(nicht n+1 == 2**61-1
)?