Python 3.9循环计算多文件SHA1哈希:后续文件结果异常求助
问题:批量计算文件SHA1哈希时,第二个及以后文件结果错误
现象
- 单独执行代码计算单个文件SHA1:结果正确,与
sha1sum命令输出一致 - 单次执行代码批量计算多个文件:第二个及以后文件的哈希值错误,和单独计算的结果不符
错误原因
原代码中hash_obj = hashlib.sha1()定义在循环外部,hash_obj.update()方法会累积更新哈希计算状态——第二个文件的哈希是基于第一个文件的哈希结果,再累加当前文件内容计算出来的,并非单独计算当前文件的SHA1值。
修复后的代码
import glob import hashlib import os path = input("请提供要搜索的路径(会包含子目录):") filepattern = input("请提供文件匹配模式,例如 *.jar、*abc*.jar:") assert os.path.exists(path), "未找到路径:" + str(path) path = path.rstrip("/") tocheck = f'{path}/**/{filepattern}' searched_file_list = glob.iglob(tocheck, recursive=True) for file in searched_file_list: print(f'{file}') try: # 每次处理新文件时,重新初始化SHA1哈希对象 hash_obj = hashlib.sha1() with open(file, 'rb') as file_for_sha1: hash_obj.update(file_for_sha1.read()) checksum = hash_obj.hexdigest() print(f'文件({file})的SHA1值= {checksum}') except Exception as e: print(f'处理文件{file}时出错:{e}')
注:改用
with语句自动管理文件句柄,无需手动调用close(),代码更简洁安全
验证结果
修改后单次批量计算两个相同内容的文件,输出的SHA1值与sha1sum命令结果一致:
文件(/home/test/git/reader/cabin/abc.txt)的SHA1值= fc4db67f46711b2c18bd133abd67965649edfffc 文件(/home/test/git/reader/check/cabin/abc.txt)的SHA1值= fc4db67f46711b2c18bd133abd67965649edfffc
内容的提问来源于stack exchange,提问作者bsethi24
相关产品推荐
相关产品推荐

