【问题标题】:Hashing with SHA1 in python3 does not produce same result在 python3 中使用 SHA1 散列不会产生相同的结果
【发布时间】:2017-02-10 19:56:37
【问题描述】:

我正在尝试编写一些代码来防止更新已修改列表。为此,我正在计算值的 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 哈希/十六进制摘要结果?

【问题讨论】:

    标签: python-3.x hash sha1


    【解决方案1】:

    您不能依赖reprrepr 的顺序@/frozenset 对象,因为这些值没有保证顺序(事实上,作为反拒绝服务功能,哈希同一版本 Python 的不同运行之间的字符串代码会有所不同,从而导致 set 顺序发生变化。

    交换您的 frozensetsorted 调用以获得一致的可重现表示。已排序的lists 保证了排序,而frozenset 将获得唯一性保证:

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

    【讨论】:

    • Ahhh tnx,这是有道理的......可能会花费数小时寻找这个。这说明了很多。
    • 请不要对回答说“谢谢”添加评论。如果回答对您有帮助,accept it。顺便说一句,你被问了 29 个问题,但只接受了第一个。为什么?
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2022-01-26
    相关资源
    最近更新 更多