Python 3.6.4(CPython)哈希函数类型及查询方法咨询
Python 3.6.4 (CPython)哈希函数相关问题解答
1. Python 3.6.4(CPython)使用的哈希函数类型
对于字符串、字节串这类可变长度的对象,CPython 3.6.4采用的是SipHash-1-3哈希函数。
从Python 3.3开始,CPython就引入了SipHash来解决之前哈希碰撞引发的安全漏洞——它会在Python启动时生成一个随机salt值混入哈希计算,默认情况下每次重启Python,同一个字符串的哈希值可能会变化。不过你提到执行hash('foo')和hash('fooo')得到了固定结果,这大概率是因为你的环境中设置了PYTHONHASHSEED环境变量为固定值,关闭了哈希随机化特性。
2. 如何查询当前Python实现的内置hash函数类型
有两种实用方法可以查询:
- 使用
sys.hash_info(推荐):在Python交互环境中执行以下代码:
输出结果里的import sys print(sys.hash_info)algorithm字段会直接显示当前使用的哈希算法名称,比如在你的3.6.4环境中,应该会显示algorithm='siphash13',同时还能看到哈希位数、种子位数等细节信息。 - 查看对应版本的CPython源码:如果想深入了解实现逻辑,可以查看CPython对应版本的源码,比如字符串的哈希逻辑在
Objects/stringobject.c文件的_PyUnicode_Hash相关函数中,这个方法更适合有一定源码阅读基础的用户。
内容的提问来源于stack exchange,提问作者Amelio Vazquez-Reina




