在 python3 中使用 SHA1 散列不会产生相同的结果
Hashing with SHA1 in python3 does not produce same result
我正在尝试编写一些代码来阻止更新已修改的列表。为此,我正在计算值的 SHA1 散列,但是当我重新启动 ipython 解释器时,此散列的 hexdigest() 会产生不同的结果。这是为什么?
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
rvl@laptop ~/ $ 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 hash/hexdigest 结果?
您不能依赖 set
/frozenset
对象的 repr
的顺序,因为值没有保证顺序(事实上,作为 anti-denial 的服务特性,字符串的哈希码在相同版本的 Python 的不同运行之间会有所不同,导致 set
顺序发生变化。
交换您的 frozenset
和 sorted
调用以获得一致的可重现表示。已排序的 list
保证顺序,而 frozenset
将为您提供唯一性保证:
hashid.update(repr(sorted(frozenset(["a","b","c"]))).encode("utf-8"))
我正在尝试编写一些代码来阻止更新已修改的列表。为此,我正在计算值的 SHA1 散列,但是当我重新启动 ipython 解释器时,此散列的 hexdigest() 会产生不同的结果。这是为什么?
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
rvl@laptop ~/ $ 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 hash/hexdigest 结果?
您不能依赖 set
/frozenset
对象的 repr
的顺序,因为值没有保证顺序(事实上,作为 anti-denial 的服务特性,字符串的哈希码在相同版本的 Python 的不同运行之间会有所不同,导致 set
顺序发生变化。
交换您的 frozenset
和 sorted
调用以获得一致的可重现表示。已排序的 list
保证顺序,而 frozenset
将为您提供唯一性保证:
hashid.update(repr(sorted(frozenset(["a","b","c"]))).encode("utf-8"))