Python中计算的文件md5哈希不正确

Python中计算的文件md5哈希不正确,python,hash,md5,hashlib,Python,Hash,Md5,Hashlib,我有一个函数,用于计算驱动器中所有文件的md5哈希值。散列是经过计算的,但它不同于我使用其他程序或在线服务得到的散列 def md5_files(path, blocksize = 2**20): hasher = hashlib.md5() hashes = {} for root, dirs, files in os.walk(path): for file in files: file_path = os.path.join(

我有一个函数,用于计算驱动器中所有文件的md5哈希值。散列是经过计算的,但它不同于我使用其他程序或在线服务得到的散列

def md5_files(path, blocksize = 2**20):
    hasher = hashlib.md5()
    hashes = {}
    for root, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)
            print(file_path)
            with open(file_path, "rb") as f:
                data = f.read(blocksize)
                if not data:
                    break
                hasher.update(data)
                hashes[file_path] = hasher.hexdigest()
    return hashes

提供的
路径是驱动器号,例如“K:\”,然后我在文件中导航并打开文件进行二进制读取。我读取
blocksize
中指定大小的数据块。然后我将每个文件的文件名和md5散列存储在名为
散列的字典中。代码看起来不错,我还检查了关于堆栈溢出的其他问题。我不知道为什么生成的md5散列是错误的。

您需要为每个文件构造一个新的md5对象并完全读取它。像这样

def md5_files(path, blocksize = 2**20):    
    hashes = {}
    for root, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)
            print(file_path)
            with open(file_path, "rb") as f:
                data = f.read(blocksize)
                hasher = hashlib.md5(data)
                while data:
                    data = f.read(blocksize)   
                    hasher.update(data)             
                hashes[file_path] = hasher.hexdigest()
    return hashes

您需要为每个文件创建一个新的
hasher
。我可以重用相同的变量吗?例如,我可以将“hasher=hashlib.md5()”放在内部循环中吗?我的意思是,在“with”语句中,我明白你的意思。是否存在代码中不需要的重复“data=f.read(blocksize)”赋值?我在“with”语句中看到一个,在“while”循环中看到一个。进入while循环时,
数据不能为空,一个简单的方法是先读取它。(数据不仅被丢弃,而且在
hashlib.md5(数据)
中使用)是的,我想我理解。在进入while循环之前检查数据是正确的,hashlib.md5()将数据用作参数。我在考虑变量数据的范围。这是一个局部变量,应该可以在函数md5_files()中的任何位置访问它,所以我可以直接执行hasher.update(data),而不必再次执行data=f.read(blocksize)吗?嗯,无论如何,如果我在“with语句”中删除“data=f.read(blocksize)”,似乎有一个无限循环,如果我像你说的那样,它处理当前文件,然后移动到下一个文件。我不知道为什么,但“with”语句中的“data=f.read(blocksize)”似乎是必要的。我测试了这个函数,它正常工作了。我接受你的回答。谢谢你的帮助。