【问题标题】:md5sum not matching python generated md5md5sum 不匹配 python 生成的 md5
【发布时间】:2020-09-06 08:14:21
【问题描述】:

我有一个奇怪的问题,我来自流文件的 md5 哈希与 md5sum 不匹配。奇怪的是,如果我读入文件并将其写入第二个文件,python md5 和md5sum second_file.txt 同意。这是哈希码:

import hashlib 
import sys

file_hash = hashlib.md5()
with open(sys.argv[1], 'r') as f, open(sys.argv[2], 'w') as w:
    while True:
        c = f.read(1)
        w.write(c)
        file_hash.update(c.encode(encoding='utf-8'))

        if c == '':
            # end of file
            break

print(file_hash.hexdigest())

这两个文件都在UTF-8 中并在 docker 容器中运行。我在这里有点不知所措。有什么想法吗?

【问题讨论】:

  • 您没有显示流式传输位......所以不太可能有人能够明确回答。 ..但猜测它是一个编码问题(即流文件通常是字节......但你正在以“r”模式而不是“rb”打开文件......也许尝试用“rb”打开文件并且不要这样做编码位
  • 已更新并正在尝试
  • 猜测您打开的文件已经是 utf8 并且在您写入后它与流匹配,因为 python 会将文件保存为 utf8 ...但我不知道该文件是使用 utf8 流式传输的
  • 在第二个文件上调用hash.py 脚本将产生与md5sum 一致的哈希值。只是原始文件给了我不同的结果。
  • @JoranBeasley 用rb 读取文件解决了这个问题。谢谢您的帮助!如果你想留下答案,我会选择它

标签: python linux file hash md5


【解决方案1】:

"rb" 模式打开文件以获取原始字节,并跳过encode 位...您正在有效地更改 md5 在执行此操作时比较的字节

【讨论】:

    【解决方案2】:

    一般来说,问题可能是 python 或 linux 的 md5sum 函数,因此如果您提供显示不同哈希值的 linux 命令行,那将是首选。以我的经验,这很可能发生在尝试从“echo”进行管道传输但忘记“echo”在它回显的任何内容中添加换行符的情况下。

    例如,这些不匹配:

    >> echo 'thing' | md5sum
    >> python -c "import hashlib;print(hashlib.md5(b'thing').hexdigest())"
    

    使用“printf”来防止添加换行符。这些确实匹配:

    >> printf 'thing' | md5sum
    >> python -c "import hashlib;print(hashlib.md5(b'thing').hexdigest())"
    

    您也可以将数据放在文件中:

    >> printf 'thing' > temp
    >> cat temp | md5sum
    >> python -c "import hashlib;print(hashlib.md5(b'thing').hexdigest())"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多