Python脚本未逐行哈希文件内容却哈希文件名问题求助
问题
编写了一段Python脚本,意图实现打开文件、读取文件内密码、逐行哈希密码并将结果保存至另一个文件。但运行脚本时,hashlib模块并未逐行哈希密码,反而哈希了文件名。脚本代码如下:
import hashlib word_list = input("Input file name to pull words from: ") hash_list = input("Input list to hash to: ") h = hashlib.sha512() f = open(word_list, 'r') f.readline() g = open(hash_list, 'w') for word in word_list: word = word.strip('\r\n') h.update(word.encode()) hashed_word = h.hexdigest() g.write(hashed_word)
测试发现,使用不同文件名但相同密码的文件运行脚本时,得到的哈希值不同,推测是哈希了文件名。
问题分析与修复
核心错误点
- 遍历对象错误:循环
for word in word_list遍历的是输入的文件名字符串(word_list是文件名),而非文件内的行内容,导致逐个字符哈希文件名。 - 哈希对象复用:哈希对象
h在循环外创建,update方法会累加数据,后续哈希会基于之前的结果继续计算,而非独立哈希每行内容。 - 多余的行跳过:
f.readline()会直接跳过文件第一行,若不是需求,会丢失数据。 - 无换行写入:写入哈希结果时未添加换行符,所有哈希值会拼接成一行,无法区分。
修复后的代码
import hashlib # 获取文件名 input_file = input("Input file name to pull words from: ") output_file = input("Input list to hash to: ") # 打开文件(使用with语句自动管理文件关闭) with open(input_file, 'r') as f, open(output_file, 'w') as g: # 逐行读取文件内容 for line in f: # 去除行首尾的空白字符(包括换行符) word = line.strip() # 跳过空行 if not word: continue # 每次哈希都创建新的sha512对象,保证独立计算 h = hashlib.sha512() h.update(word.encode('utf-8')) hashed_word = h.hexdigest() # 写入哈希值并添加换行符 g.write(f"{hashed_word}\n")
关键修改说明
- 遍历文件行:改用
for line in f遍历打开的文件对象,逐行读取内容。 - 独立哈希对象:将
hashlib.sha512()的创建移到循环内,确保每行密码都使用全新的哈希对象计算,避免累加。 - 使用with语句:自动处理文件的打开与关闭,避免资源泄漏。
- 添加换行符:写入时用
f"{hashed_word}\n",让每个哈希值单独占一行。 - 处理空行:增加空行判断,避免哈希空字符串。
内容的提问来源于stack exchange,提问作者Lawrence Evans
相关产品推荐
相关产品推荐

