2017-02-10 93 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散列/十六進制結果?

回答

1

您不能依賴的set/frozenset對象的排序,因爲這些值沒有保證的順序(事實上,作爲反拒絕服務功能,字符串的散列碼將不同在相同版本的Python的不同運行之間,導致set排序改變)。

調換您的frozensetsorted以獲得始終如一的可重複表示。排序list■找保證訂貨,而frozenset將讓你的獨特性保證:

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

唉唉TNX,這是有道理的......難道花了幾個小時尋找這一點。這很明顯。 – RvL

+0

**請不要添加評論回答說「謝謝」。**如果答案幫助了你,[接受它](http://stackoverflow.com/help/someone-answers)。 BTW你被問了29個問題,但只接受第一個。爲什麼? –

相關問題