我一直在玩巨蟒的 散列函数。对于小整数,它始终显示为 hash(n) == n
。然而,这并不适用于大量人口:
>>> hash(2**100) == 2**100
False
我并不感到惊讶,我知道散列的取值范围是有限的,这个范围是多少?
我试着用 binary search找到最小的数字 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
2305843009213693951有什么特别的? 我注意到它小于 ABc0
编辑: 我正在使用 Python 3。我在 Python2上运行了相同的二进制搜索,得到了不同的结果2147483648,我注意到它是 sys.maxint+1
我还使用了 [hash(random.random()) for i in range(10**6)]
来估计散列函数的范围。最大值一直低于上面的 n。通过比较 min,Python3的 hash 似乎总是正值,而 Python2的 hash 可能是负值。