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

为何Python程序中SHA256哈希对象作为字典键会报KeyError?

问题排查:SHA256哈希对象字符串作为字典键引发KeyError

问题描述

编写Python代码将0-99的数字转换为SHA256哈希对象的字符串形式作为字典键,原数字对应为值,但通过哈希对象字符串查找时触发KeyError,转换值类型也无法解决。

原代码

from hashlib import sha256
data = list (range (100))
s = list()
for i in data:
    s.append(str(i))
#print(s)
output = list()
for ii in s:
    output.append((sha256(ii.encode('utf-8'))))
#print(output)
l = list()
for iii in output:
    l.append(str(iii))
print(l)
dictionary = dict(zip(l,data))
print(dictionary)
print(dictionary['<sha256 _hashlib.HASH object @ 0x00000284F9296450>'])

报错信息

KeyError: '<sha256 _hashlib.HASH object @ 0x00000284F9296450>'

核心原因

你犯了一个关键错误:将哈希对象直接转为字符串时,得到的不是实际的SHA256哈希值,而是该对象在内存中的地址标识。

这个地址标识有两个致命问题:

  1. 每次重启程序,哈希对象的内存地址都会变化,你用之前运行输出的地址字符串去查当前程序的字典,必然找不到匹配的键
  2. 就算同一次运行,这个地址也只是对象的临时标识,完全不具备哈希值的唯一性和通用性,根本不适合作为字典键

解决方法

不要直接把哈希对象转成字符串,而是用哈希对象的hexdigest()方法获取实际的SHA256哈希值(十六进制格式的字符串),这才是稳定且唯一的键值。

修正后的代码

from hashlib import sha256

data = list(range(100))
# 把数字转成字符串列表
str_list = [str(num) for num in data]
# 生成每个字符串对应的SHA256哈希值字符串
hash_values = [sha256(s.encode('utf-8')).hexdigest() for s in str_list]
# 构建哈希值到原数字的字典
hash_dict = dict(zip(hash_values, data))

# 测试查询:比如查找数字0对应的哈希值
target_hash = sha256(b'0').hexdigest()
print(hash_dict[target_hash])  # 输出:0

代码说明

  • 用列表推导简化了原有的多层循环,代码更简洁
  • hexdigest()返回的是64位的十六进制哈希字符串,这才是真正的SHA256计算结果
  • 查询时,通过计算目标值的哈希值来匹配字典键,确保不会出现地址不匹配的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:05:17