我在计算字符串的md5散列时遇到了一些非常奇怪的行为。若我传递串接结果的字串,传回的杂凑总是错误的(而且是不同的)。我发现在创建字符串之后,我并没有以任何方式修改字符串。在
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import hashlib
>>> m = hashlib.md5()
>>> a1 = "stack"
>>> a2 = "overflow"
>>> a3 = a1 + a2
>>> a4 = str(a1 + a2)
>>> m.update("stackoverflow")
>>> m.hexdigest()
'73868cb1848a216984dca1b6b0ee37bc' //actuall hash
>>> m.update(a1 + a2)
>>> m.hexdigest()
'458b7358b9e0c3f561957b96e543c5a8'
>>> m.update(a3)
>>> m.hexdigest()
'65b0e62d4ff2d91e111ecc8f27f0e8f5'
>>> m.update(a4)
>>> m.hexdigest()
'60c3ae3dd9a2095340b2e024194bad3c'
>>> m.update(a1 + a2)
>>> m.hexdigest()
'acd4e14145d34dcb10af785badf8e73e'
>>> m.update(a1 + a2)
>>> m.hexdigest()
'03c06ca09faa26166f1096db02272b11'
>>> a1 + a2 == a1 + a2
True
>>> a1 + a2 == a3
True
>>> a3 == a4
True
我错过什么了吗?在
您缺少的是} documentation :
hash.update()
无法替换哈希数据。您将不断更新hash对象,因此您将获得连接字符串的哈希值。从^{大胆强调我的。在
因此,您没有得到单个},然后是{}等的哈希值,每次附加另一个
'stackoverflow'
字符串的哈希值,而是先得到'stackoverflow'
的哈希值,然后是{'stackoverflow'
来创建一个越来越长的字符串。这些较长的字符串都不等于原始的短字符串,因此它们的哈希值也不太可能相等。在为新字符串创建一个新对象,而不是:
通过发送串联数据,您可以很容易地生成“错误”哈希:
^{pr2}$请注意,您还可以将第一个字符串传入
md5()
函数:通常情况下,只有在处理块数据(如逐行读取文件或从套接字读取数据块)时,才使用
hash.update()
方法,并且不希望一次将所有这些数据保存在内存中。在相关问题 更多 >
编程相关推荐