Python计算文件SHA512哈希值每次运行结果不一致如何解决
问题原因
- 核心错误:哈希对象初始化放在了遍历文件的循环外部,
hashlib的哈希实例调用update()方法是累加计算内容,后续文件的哈希值会包含前面所有已遍历文件的内容,自然无法和单个文件的内容一一对应。 - 次要影响因素:
os.listdir()返回的文件列表顺序不固定,且当前逻辑会把运行后生成的hash.txt也纳入计算范围,都会导致最终输出结果不稳定。
修复方案
将哈希对象的初始化移动到文件遍历循环内部,保证每个文件都用全新的哈希实例计算,可选增加文件排序和过滤逻辑,保证结果完全固定,修复后代码如下:
import sys import os import hashlib BUF_SIZE = 65536 # 64KB分块读取,适配大文件计算 # 筛选文件:排除生成的hash.txt,同时排序保证遍历顺序固定 files = sorted([f for f in os.listdir('.') if os.path.isfile(f) and f != "hash.txt"]) hashes = [] for file in files: # 每个文件新建独立的SHA512实例 sha512 = hashlib.sha512() with open(file, 'rb') as f: while True: data = f.read(BUF_SIZE) if not data: break sha512.update(data) hashes.append(f"{file}|{sha512.hexdigest()}") with open("hash.txt", 'w+', encoding='utf-8') as f: for h in hashes: f.write(h+'\n') print(h)
验证方法
你可以用系统自带的哈希校验工具和脚本输出结果做对比,确认单个文件哈希正确:
- Windows系统:运行命令
certutil -hashfile 你的文件名 SHA512 - Linux/macOS系统:运行命令
shasum -a 512 你的文件名
内容的提问来源于stack exchange,提问作者acnguy2
相关产品推荐
相关产品推荐

