使用变量递归散列 Python 中的文件会给出错误的散列

Using variable to recursively hash files in Python gives false hash

我正在尝试使用 Python 递归地打印目录中文件的 md5 哈希值,但我的打开命令中的变量产生错误哈希值时遇到问题。这是我的代码:

import os
import hashlib

blocksize = 65536
md5_hash = hashlib.md5()

for root, dirs, files in os.walk('/path/to/folder'):
    for filename in files:
        os.chdir(root)
        with open(filename, 'rb') as cur_file:
            print filename
            while True:
                data = cur_file.read(blocksize)
                if not data:
                    break
                md5_hash.update(data)
        print md5_hash.hexdigest()  

如果我将 "filename" 变量更改为特定文件,如下所示:

with open('nameoffile.txt', 'rb') as cur_file:

然后生成了正确的散列,这让我相信我的 for 循环在某些方面有问题。我在正确的轨道上吗?我该怎么做才能修复变量或 for 循环以使其正常工作?

试试

md5_hash = hashlib.md5()

完成文件哈希后,因为您当前正在更新同一个文件...

您永远不会重置散列对象,即您计算所有文件串联的散列。尝试将 md5_hash = hashlib.md5() 移动到循环中:

for root, dirs, files in os.walk('/path/to/folder'):
    for filename in files:
        md5_hash = hashlib.md5()
        os.chdir(root)
        with open(filename, 'rb') as cur_file:
            print filename
            while True:
                data = cur_file.read(blocksize)
                if not data:
                    break
            md5_hash.update(data)
        print md5_hash.hexdigest()

另外:为什么是 chdir? open(os.path.join(root, filename), 'rb') 在没有额外系统调用的情况下应该可以正常工作(并且在出现错误时可能会出现不确定状态)。