Tôi đã chơi với số hash function của Python. Đối với các số nguyên nhỏ, nó luôn xuất hiện hash(n) == n
. Tuy nhiên, điều này không mở rộng đến số lượng lớn:Khi nào là băm (n) == n bằng Python?
>>> hash(2**100) == 2**100
False
Tôi không ngạc nhiên, tôi hiểu rằng hàm băm có một phạm vi giá trị hữu hạn. Phạm vi đó là gì?
tôi đã cố gắng sử dụng binary search để tìm số nhỏ nhất 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
Có gì đặc biệt về 2305843009213693951? Tôi lưu ý đó là ít hơn sys.maxsize == 9223372036854775807
Chỉnh sửa: Tôi đang sử dụng Python 3. Tôi chạy tìm kiếm nhị phân cùng trên Python 2 và nhận được một kết quả khác nhau 2147483648, mà tôi lưu ý là sys.maxint+1
Tôi cũng chơi với để ước tính phạm vi hàm băm. Giá trị tối đa luôn dưới n ở trên. So sánh phút, có vẻ như hàm băm Python 3 luôn được đánh giá tích cực, trong khi băm Python 2 có thể có giá trị âm.
Bạn đã kiểm tra biểu diễn nhị phân của số? –
'0b1111111111111111111111111111111111111111111111111111111111111' tò mò! Vì vậy, 'n + 1 == 2 ** 61-1' –
dường như phụ thuộc vào hệ thống. Với python của tôi, băm là 'n' cho toàn bộ phạm vi int 64bit. – Daniel