Tôi đã chơi với hàm băm của Python . Đối với các số nguyên nhỏ, nó hash(n) == n
luôn xuất hiện . Tuy nhiên, điều này không mở rộng đến số lượng lớn:
>>> hash(2**100) == 2**100
False
Tôi không ngạc nhiên, tôi hiểu hàm băm có một phạm vi giá trị hữu hạn. Phạm vi đó là gì?
Tôi đã thử sử dụng tìm kiếm nhị phân để tìm số nhỏ nhấthash(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 có gì đặc biệt? Tôi lưu ý rằng nó ít hơnsys.maxsize == 9223372036854775807
Chỉnh sửa: Tôi đang sử dụng Python 3. Tôi đã chạy cùng một tìm kiếm nhị phân trên Python 2 và nhận được một kết quả khác 2147483648, tôi lưu ý là sys.maxint+1
Tôi cũng đã chơi với [hash(random.random()) for i in range(10**6)]
để ước tính phạm vi của hàm băm. Giá trị lớn nhất luôn ở dưới n ở trên. So sánh tối thiểu, có vẻ như hàm băm của Python 3 luôn có giá trị dương, trong khi hàm băm của Python 2 có thể nhận các giá trị âm.
n+1 == 2**61-1
n
dành cho toàn bộ dải int 64 bit.
2147483647
bằng sys.maxint
(not sys.maxint+1
) và nếu 'n = 0b111111111111111111111111111111111111111111111111111111111111111' thì không phải n+1 == 2**61
hay n == 2**61-1
(không n+1 == 2**61-1
)?