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

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

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

您缺少的是

hash.update()
不会替换散列数据 。您将不断更新哈希对象,因此您将获得 串联字符串
的哈希值。从
hashlib.hash.update()
文档中:

使用字符串 arg 更新哈希对象。 重复调用等效于将所有参数串联在一起的单个调用:

m.update(a)
;
m.update(b)
等价于
m.update(a+b)

大胆强调我的。

因此,您不会获取单个

'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()
仅当您正在分块处理数据时才使用该方法(例如逐行读取文件或从套接字读取数据块),并且不想一次将所有数据都保存在内存中。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5143921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存