我正在使用 Python 生成 C++ 头文件。这是安全 secret ,所以我不能在这里张贴。
我根据某些输入生成它,如果这些输入没有改变,则应该生成相同的文件。
因为它是一个头文件,几乎所有地方都#included,所以触摸它会导致完整构建。所以,如果没有变化,我不想生成文件。
最简单的方法似乎是在 /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-hasher-thingies,而不是哈希。
调用 digest
获取哈希作为 bytes
对象,或调用 hexdigest
获取哈希的十六进制编码的字符串:
if newFileMd5.digest() == existingFileMd5.digest():
...
关于Python 哈希值不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58873547/