私はPythonのハッシュ関数で遊んでいます。小さな整数の場合、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
編集:私はPython 3を使用しています。Python2で同じバイナリ検索を実行し、異なる結果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ビットの整数範囲全体に対するものです。
2147483647
と等しくsys.maxint
ないsys.maxint+1
、そして 'n = 0b1111111111111111111111111111111111111111111111111111111111111'の場合、等しくないn+1 == 2**61
かn == 2**61-1
(ではないn+1 == 2**61-1
)?