我正在使用Python生成一个C++头文件。这是安全机密,所以我不能在这里张贴。
我根据某些输入生成它,如果这些输入没有改变,那么应该生成相同的文件。
因为它是一个几乎到处都包含#的头文件,所以触摸它会导致完整的构建。因此,如果没有更改,我不想生成该文件。
最简单的方法似乎是在/tmp
中生成文件,然后对现有文件进行MD5哈希,看看是否需要更新。
existingFileMd5 = hashlib.md5(open(headerFilePath, 'rb').read())
newFileMd5 = hashlib.md5(open(tempFilePath, 'rb').read())
if newFileMd5 == existingFileMd5:
print('Info: file "' + headerFilePath + '" unchanged, so not updated')
os.remove(tempFilePath)
else:
shutil.move(tempFilePath, headerFilePath)
print('Info: file "' + headerFilePath + '" updated')
然而,当我连续快速运行两次脚本(不更改输入(时,似乎总是认为MD5哈希不同,并更新文件,从而减少了构建时间。
除了由输入控制的部分之外,文件中没有其他可变部分。例如,我不是在写时间戳。
我让同事们仔细查看了这两个文件,并宣布它们是相同的(它们很小(。Linux的meld
文件比较实用程序也声明它们是相同的。
因此,问题似乎出在上面发布的代码上。我做错了什么?
您实际上忘记了请求散列。你在比较两个md5散列,而不是散列。
调用digest
以获得作为bytes
对象的哈希,或者调用hexdigest
以获得具有哈希十六进制编码的字符串:
if newFileMd5.digest() == existingFileMd5.digest():
...