Python'un hash fonksiyonu ile oynuyorum . Küçük tamsayılar için hash(n) == n
her zaman görünür . Ancak bu, büyük sayıları kapsamaz:
>>> hash(2**100) == 2**100
False
Şaşırmadım, hash'in sınırlı bir değer aralığı aldığını anlıyorum. Bu aralık nedir?
En küçük sayıyı bulmak için ikili aramayı kullanmayı denedimhash(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'i özel kılan nedir? Daha az olduğunu not ediyorumsys.maxsize == 9223372036854775807
Düzenleme: Python 3 kullanıyorum. Aynı ikili aramayı Python 2'de çalıştırdım ve 2147483648 farklı bir sonuç aldım, ki sys.maxint+1
[hash(random.random()) for i in range(10**6)]
Hash fonksiyonunun aralığını tahmin etmek için de oynadım . Maksimum, sürekli olarak yukarıdaki n'nin altındadır. Min ile karşılaştırıldığında, Python 3'ün hash değeri her zaman pozitif olarak değerlendirilirken, Python 2'nin hash değeri negatif değerler alabilir.