【问题标题】:Python hashes don't matchPython 哈希不匹配
【发布时间】:2019-11-15 09:05:30
【问题描述】:

我正在使用 Python 生成 C++ 头文件。它是安全分类的,所以我不能在这里发布。

我根据某些输入生成它,如果这些不改变,则应该生成相同的文件。

因为它是一个几乎无处不在#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 文件比较实用程序也将它们声明为相同。

因此,问题似乎出在上面发布的代码上。我做错了什么?

【问题讨论】:

标签: python md5


【解决方案1】:

您忘记实际询问哈希值。您正在比较两个 md5-hasher-thingies,而不是哈希。

调用digest 以将哈希作为bytes 对象获取,或调用hexdigest 以获取具有哈希的十六进制编码的字符串:

if newFileMd5.digest() == existingFileMd5.digest():
    ...

【讨论】:

  • 天啊!一旦你指出它就很明显了。在你做之前是看不见的。同时,我使用了filecmp.cmp(),它可能只是包装了MD5摘要比较。
猜你喜欢
  • 2020-01-27
  • 2021-04-23
  • 2011-09-12
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多