问题场景:根据给定的字符串生成32位哈希码。
第一版代码如下:
import hashlib
md5_machine = hashlib.md5()
def gen_md5_id(item):
md5_machine.update(item.encode('utf-8'))
return md5_machine.hexdigest()
同一个字符串两次运行产生的哈希码竟然不同,如下所示:
>>> gen_md5_id('123')
'202cb962ac59075b964b07152d234b70'
>>> gen_md5_id('123')
'4297f44b13955235245b2497399d7a93'
官方文档(https://docs.python.org/2/library/md5.html)对update函数使用说明如下:
Update the md5 object with the string arg. Repeated calls are equivalent to a single call with the concatenation of all the arguments: m.update(a); m.update(b) is equivalent to m.update(a+b).
如果重复使用对象,第二次产生的哈希码实际上是和两次字符串拼接所产生的结果是一致的。改为如下代码就行:
import hashlib
def gen_md5_id(item):
md5_machine = hashlib.md5()
md5_machine.update(item.encode('utf-8'))
return md5_machine.hexdigest()
现在两次生成的结果就一样了:
>>> gen_md5_id('123')
'202cb962ac59075b964b07152d234b70'
>>> gen_md5_id('123')
'202cb962ac59075b964b07152d234b70'
另外可以看到第二段代码生成"123123"的哈希码和第一段代码第二次调用生成"123"的代码是一样的,由此佐证了文档中的解释。
>>> gen_md5_id('123123')
'4297f44b13955235245b2497399d7a93'