Python 哈希值不匹配
Python hashes don't match
我正在使用 Python 生成 C++ 头文件。它是安全机密,所以我不能在这里 post。
我根据某些输入生成它,如果这些没有改变,应该生成相同的文件。
因为它是一个头文件,几乎所有地方都#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
文件比较实用程序也将它们声明为相同。
所以,问题似乎出在上面的代码 posted 上。我做错了什么?
您实际上忘记了请求哈希值。您正在比较两个 md5-hasher-thingies,而不是哈希。
调用 digest
获取散列作为 bytes
对象,或 hexdigest
获取散列的十六进制编码的字符串:
if newFileMd5.digest() == existingFileMd5.digest():
...
我正在使用 Python 生成 C++ 头文件。它是安全机密,所以我不能在这里 post。
我根据某些输入生成它,如果这些没有改变,应该生成相同的文件。
因为它是一个头文件,几乎所有地方都#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
文件比较实用程序也将它们声明为相同。
所以,问题似乎出在上面的代码 posted 上。我做错了什么?
您实际上忘记了请求哈希值。您正在比较两个 md5-hasher-thingies,而不是哈希。
调用 digest
获取散列作为 bytes
对象,或 hexdigest
获取散列的十六进制编码的字符串:
if newFileMd5.digest() == existingFileMd5.digest():
...