J'ai joué avec la fonction de hachage de Python . Pour les petits entiers, il apparaît hash(n) == n
toujours. Cependant, cela ne s'étend pas aux grands nombres:
>>> hash(2**100) == 2**100
False
Je ne suis pas surpris, je comprends que le hachage prend une plage finie de valeurs. Quelle est cette plage?
J'ai essayé d'utiliser la recherche binaire pour trouver le plus petit nombrehash(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
Quelle est la particularité du 2305843009213693951? Je note que c'est moins quesys.maxsize == 9223372036854775807
Edit: J'utilise Python 3. J'ai exécuté la même recherche binaire sur Python 2 et j'ai obtenu un résultat différent 2147483648, que je note est sys.maxint+1
J'ai également joué avec [hash(random.random()) for i in range(10**6)]
pour estimer la plage de fonction de hachage. Le max est systématiquement inférieur à n ci-dessus. En comparant le min, il semble que le hachage de Python 3 a toujours une valeur positive, alors que le hachage de Python 2 peut prendre des valeurs négatives.
n+1 == 2**61-1
n
concerne toute la plage 64 bits int.
2147483647
égal à sys.maxint
(non sys.maxint+1
), et si 'n = 0b11111111111111111111111111111111111111111111111111111111111' alors non n+1 == 2**61
ou n == 2**61-1
(pas n+1 == 2**61-1
)?