J'ai joué avec Python fonction de hachage. Pour les petits nombres, il apparaît hash(n) == n
toujours. Toutefois, cela ne s'étend pas aux grands nombres:
>>> hash(2**100) == 2**100
False
Je ne suis pas surpris, je comprends de hachage prend une gamme finie de valeurs. Quelle en est la portée?
J'ai essayé d'utiliser les binaires de recherche pour trouver le plus petit nombre 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
Ce qui est spécial au sujet de 2305843009213693951? Je remarque, c'est moins de sys.maxsize == 9223372036854775807
Edit: je suis à l'aide de Python 3. J'ai couru le même binaire de recherche sur le langage Python 2 et j'ai obtenu un résultat différent 2147483648, que je remarque est - sys.maxint+1
J'ai aussi joué avec [hash(random.random()) for i in range(10**6)]
à estimer la portée de la fonction de hachage. Le max est constamment au-dessous de n au-dessus. La comparaison de la min, il semble Python 3 de hachage est toujours évaluée positivement, alors que Python 2 hachage peut prendre des valeurs négatives.