私は現在hash
、いくつかのオブジェクトの一意性を計算するために、整数と文字列のタプル (および整数と文字列のネストされたタプルなど) を使用しています。ハッシュ衝突の可能性を除けば、hash
これらのデータ型の関数は異なるバージョンの Python で同じ結果を返すことが保証されているのでしょうか?
3 に答える
いいえ。Python の 32 ビット バージョンと 64 ビット バージョンの間の長年にわたる違いは別として、セキュリティ上の問題を解決するために、ハッシュ アルゴリズムが Python 3.3 で変更されました。
デフォルトでは、str、bytes、および datetime オブジェクトのhash () 値は、予測不可能なランダム値で「ソルト」されます。個々の Python プロセス内では一定のままですが、Python の呼び出しが繰り返される間は予測できません。
これは、dict 挿入の最悪の場合のパフォーマンス、O(n^2) の複雑さを悪用する慎重に選択された入力によって引き起こされるサービス拒否に対する保護を提供することを目的としています。詳細については、 http://www.ocert.org/advisories/ocert-2011-003.htmlを参照してください。
ハッシュ値を変更すると、辞書、セット、およびその他のマッピングの反復順序に影響します。Python は、この順序付けについて保証していません (通常、32 ビット ビルドと 64 ビット ビルドでは異なります)。
その結果、3.3 以降hash()
では、同じ Python バージョンの異なる呼び出しで同じ結果を返すことさえ保証されていません。
いいえ。
32ビット
Python 2.7.3 (default, Aug 1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> hash("foobar")
-1969371895
64ビット
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> hash("foobar")
3433925302934160649