Saya telah bermain dengan fungsi hash Python . Untuk bilangan bulat kecil, itu hash(n) == n
selalu muncul . Namun ini tidak berlaku untuk jumlah besar:
>>> hash(2**100) == 2**100
False
Saya tidak terkejut, saya mengerti hash membutuhkan rentang nilai yang terbatas. Berapa kisaran itu?
Saya mencoba menggunakan pencarian biner untuk menemukan angka terkecilhash(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
Apa yang spesial dari 2305843009213693951? Saya perhatikan itu kurang darisys.maxsize == 9223372036854775807
Sunting: Saya menggunakan Python 3. Saya menjalankan pencarian biner yang sama pada Python 2 dan mendapatkan hasil yang berbeda 2147483648, yang saya perhatikan adalah sys.maxint+1
Saya juga bermain-main dengan [hash(random.random()) for i in range(10**6)]
memperkirakan kisaran fungsi hash. Maksimal secara konsisten di bawah n di atas. Membandingkan min, tampaknya hash Python 3 selalu bernilai positif, sedangkan hash Python 2 dapat mengambil nilai negatif.
n+1 == 2**61-1
n
untuk seluruh kisaran int 64bit.
2147483647
sama dengan sys.maxint
(tidak sys.maxint+1
), dan jika 'n = 0b1111111111111111111111111111111111111111111111111111111111111' maka bukan n+1 == 2**61
atau n == 2**61-1
(tidak n+1 == 2**61-1
)?