您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

奇怪的python的hashlib.md5行为,每次都有不同的哈希

奇怪的python的hashlib.md5行为,每次都有不同的哈希

您缺少的是hash.update() 。您将不断更新哈希对象,因此您将获得 串联字符串 的哈希值。从hashlib.hash.update()文档中

使用字符串 arg 更新哈希对象。

大胆强调我的。

因此,您不会获取单个'stackoverflow'字符串的哈希,而是首先获取的哈希值'stackoverflow',然后获取的哈希值'stackoverflowstackoverflow',再获取'stackoverflowstackoverflowstackoverflow'等等,每次都添加一个哈希值,则'stackoverflow'创建的字符串越来越长。这些较长的字符串都不与原始的较短的字符串相等,因此它们的哈希也不太可能相等。

为新字符串创建一个 对象,而不是:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update('stack' + 'overflow')
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'
>>> m = hashlib.md5()   # **new** hash object
>>> m.update('stackoverflow')
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'
>>> m = hashlib.md5()     # new object again
>>> m.update('stack')     # add the string in pieces, part 1
>>> m.update('overflow')  # and part 2
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'

您可以通过发送串联数据轻松产生“错误”哈希:

>>> m = hashlib.md5()
>>> m.update('stackoverflowstackoverflow')
>>> m.hexdigest()
'458b7358b9e0c3f561957b96e543c5a8'
>>> m = hashlib.md5()
>>> m.update('stackoverflowstackoverflowstackoverflow')
>>> m.hexdigest()
'65b0e62d4ff2d91e111ecc8f27f0e8f5'
>>> m = hashlib.md5()
>>> m.update('stackoverflow' * 4)
>>> m.hexdigest()
'60c3ae3dd9a2095340b2e024194bad3c'

请注意,您还可以将第一个字符串传递给md5()函数

>>> hashlib.md5('stackoverflow').hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'

通常,hash.update()仅当您正在分块处理数据时才使用该方法(例如逐行读取文件或从套接字读取数据块),并且不想一次将所有数据都保存在内存中。

python 2022/1/1 18:26:09 有668人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶