您缺少的是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'
>>> hashlib.md5('stackoverflow').hexdigest()
'73868cb1848a216984dca1b6b0ee37bc'
通常,hash.update()
仅当您正在分块处理数据时才使用该方法(例如逐行读取文件或从套接字读取数据块),并且不想一次将所有数据都保存在内存中。