Python内置hash函数相同输入多次运行为何返回不同结果?
问题原因
这是Python的默认安全机制导致的,和代码逻辑无关:
- 从Python 3.3版本开始,解释器默认开启哈希随机化防护:每次启动Python进程时,会随机生成一个哈希种子,内置
hash()函数对字符串、字节串、包含这类元素的元组的计算结果,都会和这个随机种子绑定。 - 只要重启Python进程,哪怕输入完全一致,
hash()的返回值也会变化。这个设计是为了防范哈希碰撞拒绝服务攻击——避免攻击者构造大量哈希值相同的恶意输入,把字典、集合的O(1)查询拖成O(n),打垮服务。
验证方式
你可以自己简单验证这个逻辑:
- 在同一个Python交互环境/同一个进程运行周期里,反复调用
get_hash(sample_list),返回值一定是固定的,因为进程启动后哈希种子就不会再变; - 启动脚本时手动指定固定的哈希种子,多次运行的返回值就会完全一致,启动命令参考:
# Linux/macOS 环境 PYTHONHASHSEED=0 python your_script_path.py # Windows PowerShell 环境 $env:PYTHONHASHSEED=0; python your_script_path.py
注意事项
绝对不要在需要稳定哈希结果的场景依赖内置hash()函数,包括但不限于:
- 做文件/内容的完整性校验
- 把哈希值持久化存储到数据库、文件中
- 跨进程、跨服务、跨节点比对哈希值
这类场景应该换用不受随机种子影响的哈希实现: - 需要加密安全性的场景,用标准库
hashlib提供的SHA256、MD5等算法 - 追求高性能的非加密哈希场景,可以选用xxHash、MurmurHash这类成熟实现
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

