我正在使用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
文件比较实用工具还宣布它们相同。
因此,问题似乎出在上面发布的代码上。我在做什么错了?
答案 0 :(得分:4)
您忘了实际要求散列了。您正在比较两个md5-hasher-thingies,而不是哈希。
调用digest
获得哈希作为bytes
对象,或调用hexdigest
获得具有哈希的十六进制编码的字符串:
if newFileMd5.digest() == existingFileMd5.digest():
...