Python 3.3 のハッシュ関数: セッション間で異なる結果が返される理由
Python 3.3 では、内部 hash() 関数が予期せぬ動作をします。異なるセッションで同じ文字列に対して異なるハッシュ値を返す。この現象は、Python がセキュリティ対策としてランダム ハッシュ シードを使用していることに起因します。
ランダム ハッシュ シードは、攻撃者がタールピット攻撃を引き起こす可能性のある予測可能なキーを悪用するのを防ぐために使用されます。ハッシュにランダムなオフセットを追加することで、攻撃者はどのキーが衝突するかを予測できなくなります。
ハッシュ関数の動作を制御するには、PYTHONHASHSEED 環境変数を設定できます。固定の正のシードを指定するとランダム性を抑制できますが、これを 0 に設定するとシード オフセットが完全に無効になります。
Python 3.3 より前では、ランダム ハッシュ シードは無効でした。ただし、デフォルトで有効になりました。この変更は、セットだけでなく、Python バージョン 3.5 以前の辞書にも影響します。
さらに、object.__hash__() には特別な動作があります。
ハッシュ値は、辞書やセットなどのマッピングの反復順序に影響を与えることに注意することが重要です。ただし、そのような順序は Python によって保証されず、ビルドやバージョンによって異なる場合があります。
一貫したハッシュを行うには、暗号化ハッシュ関数を提供する hashlib モジュールの使用を検討してください。さらに、pybloom は安定性のためにこのアプローチを利用しています。
ランダムなハッシュ シード オフセットにより、攻撃者がオフセットを決定することが困難になりますが、オフセット自体の保存も妨げられます。ただし、これにより、攻撃者はシードを決定するためにタイミング攻撃を使用できなくなります。
以上がPython 3.3 のハッシュ値がセッション間で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。