md5sum 不匹配 python 生成的 md5

md5sum not matching python generated md5

我遇到了一个奇怪的问题,我的流文件中的 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())

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

一般来说,问题可能出在 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())"

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