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

Python3 hashlib计算SHA256哈希值每次结果不同的问题

问题分析与修复方案

哦,我一眼就发现问题所在了!你当前的代码根本没有计算文件内容的SHA256哈希,而是在对fileinput.FileInput对象的字符串表示进行哈希操作——这个对象的repr()结果里包含了动态的内存地址信息,每次运行程序时这个地址都会变化,所以每次生成的哈希值自然不一样。

错误原因拆解

你代码里的这一行是核心问题:

filehash.update(repr(fintake).encode("utf-8"))

repr(fintake)返回的是类似<fileinput.FileInput object at 0x7f8b12345678>这样的字符串,其中0x7f8b12345678是对象的内存地址,每次运行都会随机分配不同的值,相当于你每次都在哈希不同的内容,结果肯定不一致。

修正后的代码

我们需要读取文件的实际二进制内容来更新哈希对象,这样只要文件内容不变,哈希结果就会始终一致。这里提供两种实现方式:

方式1:逐行读取(适合小文件)

import hashlib
import fileinput

def calculate_file_sha256(intake):
    # 初始化SHA256哈希对象
    filehash = hashlib.sha256()
    
    # 以二进制模式读取文件内容
    with fileinput.FileInput(files=(intake), mode='rb') as fintake:
        # 逐行读取并更新哈希
        for line in fintake:
            filehash.update(line)
    
    # 返回十六进制格式的哈希摘要
    return filehash.hexdigest()

方式2:分块读取(适合大文件,内存更友好)

如果你的文件比较大,逐行读取效率不高,可以用固定大小的块来读取:

import hashlib
import fileinput

def calculate_file_sha256(intake):
    filehash = hashlib.sha256()
    block_size = 65536  # 64KB的块大小,平衡效率和内存占用
    
    with fileinput.FileInput(files=(intake), mode='rb') as fintake:
        # 循环读取文件块直到结束
        while chunk := fintake.read(block_size):
            filehash.update(chunk)
    
    return filehash.hexdigest()

关键注意事项

  • 一定要用mode='rb'(二进制读取模式):这样可以避免不同操作系统下换行符自动转换的问题(比如Windows的\r\n和Linux的\n),确保哈希计算基于文件原始二进制内容,跨平台结果一致。
  • 不要直接哈希文件对象:必须读取对象里的内容再更新哈希,否则就会像你之前那样,哈希的是对象本身而不是文件内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:51:44