Python中hash值计算原理及脚本多次运行hash值变动原因咨询
Python hash() 方法常见问题解答
字符串哈希的计算逻辑
Python的字符串哈希没有公开的固定计算式可以直接算出你示例中的1567799509结果,具体实现受以下因素影响:
- 不同Python版本的哈希算法不同:Python 3.10+ 默认对ASCII字符串、字节串使用SipHash 1-3算法,更早版本部分使用修改版的FNV哈希算法
- 哈希计算会默认引入随机参数,你看到的运行结果是加入了随机种子后的输出,如果关闭哈希随机化(运行前设置环境变量
PYTHONHASHSEED=0),同版本、同架构的Python对同一个字符串的哈希值会固定。
多次运行哈希值变动的原因
哈希值会在不同次Python运行时发生变动,原因如下:
- Python 3.3及之后的版本默认开启了哈希随机化机制,该机制的设计目的是防范哈希碰撞拒绝服务攻击:如果哈希规则固定,攻击者可以批量构造哈希值相同的字符串,让字典、集合这类依赖哈希的容器查询效率从O(1)退化到O(n),严重拖慢程序性能
- 每次启动Python解释器时,系统会自动生成一个随机的种子值参与哈希运算,所以不同次启动解释器运行相同代码,得到的字符串哈希值会不同
- 注意:同一次解释器运行过程中,同一个不可变对象的哈希值是固定的;只有整数类型的哈希值固定等于自身,不受哈希随机化影响。
内容的提问来源于stack exchange,提问作者Ibrahim Ayoola
相关产品推荐
相关产品推荐

