2017-02-10 11 views
0

変更されたリストを更新できないようなコードを書こうとしています。これについては、値のSHA1ハッシュを計算していますが、ipythonインタプリタを再起動すると、このハッシュのhexdigest()が別の結果を生成します。どうしてこれなの?python3でSHA1をハッシュしても同じ結果が得られません

In [1]: import hashlib 

In [2]: hashid = hashlib.sha1() 

In [3]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [4]: hashid.hexdigest() 
Out[4]: '53ca01b21fd7cb1996634bb45ad74851f73c45d3' 

hashidを再初期化し、それが動作する同じipython3コンソールに再びハッシュ計算を行う場合:

In [5]: hashid = hashlib.sha1() 

In [6]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [7]: hashid.hexdigest() 
Out[7]: '53ca01b21fd7cb1996634bb45ad74851f73c45d3' 

しかし、私のコンソールを停止し、それを再起動することは異なる結果を生成します。

In [7]: exit 
[email protected] ~/ $ ipython3 
In [1]: import hashlib 

In [2]: hashid = hashlib.sha1() 

In [3]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [4]: hashid.hexdigest() 
Out[4]: '6e5813fcb173e35e81d6138eab4d21482885e7eb' 

これはなぜですか?そして、どのように私は同じSHA1ハッシュ/ hexdigest結果を生成することができます同じソートされたリストを持っている?

答えて

1

値は何の保証順序がありません(実際には、サービス機能の抗拒否として、文字列のハッシュコードが異なりますので、あなたは、set/frozensetオブジェクトのreprの順序に依存することはできませんPythonの同じバージョンの異なる実行間で、setの順序を変更する)。

frozensetsortedのコールを一貫して再現可能な表現にするために交換してください。

hashid.update(repr(sorted(frozenset(["a","b","c"]))).encode("utf-8")) 
+0

ああのTNX、理にかなって...これを探して時間を費やしているん:list sがfrozensetはあなたに一意性の保証を取得しますが、順序を保証しているソート。これにより多くのことが明らかになります。 – RvL

+0

**「ありがとうございました」と言う回答にコメントを追加しないでください。**回答が助けになった場合は、[同意します](http://stackoverflow.com/help/someone-answers)。あなたは29の質問を受けましたが、最初のものだけを受け入れました。どうして? –

関連する問題