2017-02-10 79 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个问题,但只接受第一个。为什么? –

相关问题