web-dev-qa-db-ja.com

pythonのハッシュ関数

hash()関数は、すべてのpythonインタープリターで同じように動作します。ただし、モバイルで python for Android を使用して実行すると異なります。文字列と数値のハッシュに対して同じハッシュ値を取得しますが、組み込みデータ型をハッシュするとハッシュ値が異なります。

PC Python Interpreter(Python 2.7.3)

>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

モバイルPython Interpreter(Python 2.6.2)

>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

誰でもそれがバグであるか、または私が何かを誤解したと言うことができます。

28
bkmagnetron

古いpython(少なくとも、私のPython 2.7)の場合、

_hash(<some type>) = id(<type>) / 16
_

cPythonの場合、id()はメモリ内のアドレスです。 http://docs.python.org/2/library/functions.html#id

_>>> id(int) / hash(int)                                                     
16                                                                              
>>> id(int) % hash(int)                                                 
0                                                                               
_

だから、私の推測ではAndroidポートにはメモリアドレスの奇妙な慣習があるのでしょうか?

とにかく、上記を考慮すると、関数は異なるアドレスにあるため、タイプ(および他のビルトイン)のハッシュはインストールによって異なります。

対照的に、値のハッシュ(「非内部オブジェクト」とはどういう意味ですか)(ランダムなものが追加される前)は、その値から計算されるため、繰り返し可能性が高いです。

PSしかし、少なくとももう1つのCPythonのしわがあります。

_>>> for i in range(-1000,1000):
...     if hash(i) != i: print(i)
...
-1
_

それを説明する答えがどこかにあります...

10
andrew cooke

hash()は、最近のバージョン(Python3.3 +)の新しいインスタンスを開始するたびに 辞書挿入DOS攻撃を防ぐ にデフォルトでランダム化されます

それ以前は、hash()はとにかく32ビットと64ビットのビルドで異なっていました。

毎回同じものにハッシュするdoesが必要な場合は、hashlibのハッシュの1つを使用します

>>> import hashlib
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
35
John La Rooy

CPythonでは、効率上の理由により、内部オブジェクトの hash()id() と同じ値を返し、その結果、オブジェクトのメモリ位置(「アドレス」)。

1つのCPythonベースのインタープリターからそのようなオブジェクトの他のメモリ位置までは、変更される可能性があります。 OSによっては、これは実行ごとに変わる可能性があります。

1
Sylvain Leroux

Intのようなもののハッシュはid()に依存します。これは実行間またはインタープリター間で一定であることが保証されていません。つまり、hash(int)はプログラムの実行中に常に同じ結果を生成しますが、同じプラットフォーム上でも異なるプラットフォーム上でも、実行間で同等の比較を行わない場合があります。

ところで、ハッシュランダム化はPythonで利用できますが、デフォルトでは無効になっています。文字列と数字は等しくハッシュされるため、明らかにここでは問題ではありません。

1
Sneftel

Python 3.3から、デフォルトのハッシュアルゴリズムは、同じマシン上の異なるpythonプロセス間でも異なるランダム値でソルトされるハッシュ値を作成しました。

ハッシュランダム化は現在、文字列に対してのみ実装されています-攻撃される可能性が最も高いのは外部からキャプチャされたデータ型であると考えられていたためです。

同じfrozensetは、異なるマシンまたは異なるプロセス間で一貫して同じハッシュ値を生成します

ソース: https://www.quora.com/Do-two-computers-produce-the-same-hash-for-identical-objects-in-Python

0
nabiltos