我一直在玩Python的hash函数。对于小整数,它hash(n) == n
总是出现。但是,这不会扩展为大量:
>>> hash(2**100) == 2**100
False
我并不感到惊讶,我知道哈希值取值范围有限。这个范围是多少?
我尝试使用二进制搜索来找到最小的数字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有什么特别之处?我注意到它小于sys.maxsize == 9223372036854775807
编辑:我正在使用Python3。我在Python 2上运行了相同的二进制搜索,得到了不同的结果2147483648,我注意到这是 sys.maxint+1
我也玩过[hash(random.random()) for i in range(10**6)]
以估计哈希函数的范围。最大值始终低于上面的n。比较最小值,似乎Python 3的哈希值始终为正值,而Python 2的哈希值可以为负值。
n+1 == 2**61-1
n
用于整个64位int范围。
2147483647
等于sys.maxint
(不sys.maxint+1
),并且如果“N = 0b1111111111111111111111111111111111111111111111111111111111111”那么也不n+1 == 2**61
或n == 2**61-1
(未n+1 == 2**61-1
)?