Python批量计算相同内容文件MD5哈希值结果不一致如何解决
批量计算MD5哈希值异常问题排查与修复
核心问题根源
你遇到的哈希值批量计算结果全部不一致的问题,是代码逻辑错误导致的:
hashlib的哈希实例
update方法为累加式更新,而非重置后计算。你的代码将hash_code = hashlib.md5()放在遍历文件的循环外初始化,每计算一个新文件时,会把当前文件的内容追加到上一个文件的内容后再计算哈希,相当于得到的是前N个文件拼接后的哈希值,自然所有结果都不相同。手动逐个计算时每次都会新建哈希实例,所以结果正确。
另外代码还存在两个潜在问题:
- 单次只读1024字节,若文件大小超过1KB,只会计算前1KB内容的哈希,无法得到整个文件的正确哈希
- 直接调用
open()读取文件后未主动关闭,会造成文件句柄泄漏
修复后的正确代码
import hashlib import os fileDir = 'F:\\hashcodepy' files_list = [] for dirpath, _, filenames in os.walk(fileDir): for f in filenames: files_list.append(os.path.abspath(os.path.join(dirpath, f))) filehashcode = [] buffer_size = 1024 for x in files_list: # 每个文件单独初始化新的哈希实例,避免内容累加 hash_code = hashlib.md5() # 使用with上下文管理器自动关闭文件 with open(x, 'rb') as f: # 循环读取整个文件内容,适配大文件场景 while chunk := f.read(buffer_size): hash_code.update(chunk) filehashcode.append(hash_code.hexdigest()) print(filehashcode)
通用排查步骤
如果修改后仍有问题,可以按以下顺序排查:
- 打印
files_list列表,确认遍历到的文件路径完全正确,没有误读其他目录下的文件 - 打印每个文件读取到的字节总长度,确认相同内容的文件读取到的字节长度一致,排除文件读取不全、权限不足的问题
- 取两个内容完全相同的文件,打印读取到的二进制内容,确认字节完全一致,排除文件实际内容不一致、隐藏属性/系统后缀名干扰的问题
内容的提问来源于stack exchange,提问作者jayeshkumar patel
相关产品推荐
相关产品推荐

