You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

关键修改说明

  1. 遍历文件行:改用for line in f遍历打开的文件对象,逐行读取内容。
  2. 独立哈希对象:将hashlib.sha512()的创建移到循环内,确保每行密码都使用全新的哈希对象计算,避免累加。
  3. 使用with语句:自动处理文件的打开与关闭,避免资源泄漏。
  4. 添加换行符:写入时用f"{hashed_word}\n",让每个哈希值单独占一行。
  5. 处理空行:增加空行判断,避免哈希空字符串。

内容的提问来源于stack exchange,提问作者Lawrence Evans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:44:52