python的hashlib库疑似有bug?和大家一起讨论下
昨天晚上遇到的问题:简单而言需要将src目录中有改变的csv文件重新转成xml文件放在dst之中,判断依据就是根据md5值判断的。
在生成xml文件时会读取csv文件的md5值,将其写入xml文件之中;下一次再读取csv文件时会重新计算其md5值,如果二者相同则说明csv文件没有发生变化则不替换,否则替换。然后诡异的事情发生了,比如我啥都没做,但是这个时候我发b.csv文件可能也会被认为被修改了,也会跟着重新转xml文件。具体的过程还涉及到svn操作之类的,但是反复检查之后确定不是这个问题。弄了一天,昨晚九点的时候,在我公司导师的指导下,添加下面的调试代码,比较了下python生成的md5和直接调用linux命令md5sum生成的值,发现二者不一样。然后我放弃了使用hashlib的做法,都直接用linux的计算方法生成md5值,然后就没出现问题了。
真是一次操蛋debug的经历,从早弄到晚。我又重现了下问题,第一个文件a.csv如果不做修改,是不会有问题的,从第二个开始就开始有一定的问题,所以我猜是不是hashlib的实现中是不是有一些全局变量或者是类变量之类的没有及时清零导致的。
-----------------------------------------------------------------------------------------------第一次更新-----------------------------------------
回复下评论区兄弟的提问,补充内容,hashlib求md5方法:网上那种很经典的求法。
封装hash定义:
读取文件:
回答:
哈哈看到你说第一个文件hash正确接下来的出错我就猜你是重复使用同一个hash对象来update了(^ワ^)。在help(hashlib.md5())
中有句说的很清楚了:update() -- updates the current digest with an additional string
。你这样是把后面的文件加到前面文件后边再一起hash掉了,当然出错了(^ワ^)。正确的做法是直接把要hash的对象传给hashlib.md5
:
>>> help(hashlib.md5)Help on built-in function openssl_md5 in module _hashlib:
openssl_md5(...)
Returns a md5 hash object; optionally initialized with a string
>>> hashlib.md5(b'hello').hexdigest()
'5d41402abc4b2a76b9719d911017c592'
>>> hashlib.md5(b'world').hexdigest()
'7d793037a0760186574b0282f2f435e7'
可与md5sum命令的结果对比一下,完全一致(注意echo要加-n
参数来阻止产生换行符):
➜ ~ echo -n hello | md5sum5d41402abc4b2a76b9719d911017c592 -
➜ ~ echo -n world | md5sum
7d793037a0760186574b0282f2f435e7 -
另外说句题外话,直接os.popen(cmd).read()
这样不关闭管道真的好吗。。
以上是 python的hashlib库疑似有bug?和大家一起讨论下 的全部内容, 来源链接: utcz.com/a/160122.html