为何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哈希值,而是该对象在内存中的地址标识。
这个地址标识有两个致命问题:
- 每次重启程序,哈希对象的内存地址都会变化,你用之前运行输出的地址字符串去查当前程序的字典,必然找不到匹配的键
- 就算同一次运行,这个地址也只是对象的临时标识,完全不具备哈希值的唯一性和通用性,根本不适合作为字典键
解决方法
不要直接把哈希对象转成字符串,而是用哈希对象的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
相关产品推荐
相关产品推荐

