Pythonでhash(n)== nはいつですか?

| |

私はPythonで遊んでいますハッシュ関数。小さい整数の場合、常に hash(n)== nと表示されます。ただし、これは多数には適用されません。

 >>> hash(2 ** 100)== 2 ** 100 False  

驚くことではありませんが、ハッシュは有限の範囲の値を取ることを理解しています。その範囲は何ですか?

バイナリ検索を使用して最小数のを見つけてみましたhash(n)!= n

 >>> import codejamhelpers#pip install codejamhelpers>>> help(codejamhelpers.binary_search)関数binary_searchのヘルプmodule codejamhelpers.binary_search:binary_search(f、t)増加する関数:math: `f`が与えられた場合、:math:` f(n)let`のような最大の非負の整数:math:`n`を見つけます。 :math: `f(n)> t` for all:math:` n ge 0`、return None。>>> f = lambda n:int(hash(n)!= n)>&gt ;> n = codejamhelpers.binary_search(f、0)>>> hash(n)2305843009213693950>>> hash(n + 1)0  

What " s特別な2305843009213693951について? sys.maxsize == 9223372036854775807

編集:Python 3を使用しています。Python2で同じバイナリ検索を実行したところ、異なる結果が得られました。 2147483648、私が注意しているのは sys.maxint + 1

また、range(10 ** 6)のiに対して [hash(random.random())で遊んだ)]ハッシュ関数の範囲を推定します。最大値は一貫して上記のnを下回っています。最小値を比較すると、Python 3のハッシュは常に正の値であるように見えますが、Python2のハッシュは負の値をとることがあります。