Python 哈希值不匹配

标签 python md5

我正在使用 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/

相关文章:

python - "De-instrument"来自 sqlalchemy ORM 的实例化对象

python - 在python中按键/id划分行中的值

java - 如何在 Java 中将 md5 哈希转换为整数类型?

c - 如何在 C++ 中使用 openssl/md5 来散列字符串?

java - MD5 结果不同

performance - MD* 或 SHA-* 中是否有任何 "out of band"哈希值?

python - 启动和停止外部程序?

Python:我有具有相同列名的 Pandas 数据框。如何改变其中之一?

python - 从python字典中删除元素

javascript - 使用 CryptoJS 计算图像的 MD5 或 SHA