Python中hash()函数所采用的数学运算是什么?
hash()函数背后的数学运算细节 嘿,这个问题得掰碎了说——Python的hash()函数根本不是单一的某一种数学运算,它会根据你传入的数据类型用完全不同的哈希实现,甚至还会受Python版本、操作系统的影响(不过你能得到固定的6266945022561323786这个结果,大概率是关闭了Python 3.3+默认开启的字符串哈希随机化,或者用了比较老的Python版本)。
下面分几种常见情况给你拆解:
字符串类型(比如你例子里的
'hello world')
Python用的是经过优化的多项式滚动哈希变种,核心逻辑可以简化理解为:
先初始化一个哈希值,然后逐个遍历字符串里的每个字符,把当前哈希值乘以一个大质数(比如1000003),再加上字符的Unicode码点,最后再通过移位异或做混淆处理。
给你一个简化版的伪代码参考(实际Python的实现会更复杂,还会加入随机种子处理):def simplified_str_hash(s): hash_val = 0 for char in s: hash_val = hash_val * 1000003 + ord(char) # 移位异或做混淆,减少碰撞概率 hash_val ^= hash_val >> 16 return hash_val另外提一句,Python 3.3之后默认会给字符串哈希加随机种子,每次启动Python这个种子都会变,所以同一个字符串每次运行的哈希值可能不一样——你能得到固定值,应该是设置了
PYTHONHASHSEED环境变量为固定数字。数值类型(int、float)
- 整数的哈希最直接:只要是Python能表示的整数,
hash(n)的结果就是n本身,比如hash(42)返回42。 - 浮点数的话,会先把浮点数转换成对应的二进制字节数据,再对这些字节用类似字符串的哈希逻辑计算,最终得到哈希值。
- 整数的哈希最直接:只要是Python能表示的整数,
自定义对象
如果是你自己写的类,默认的hash()是基于对象的内存地址生成的,但你可以重写__hash__()方法,自定义基于对象属性的哈希逻辑——比如用对象的几个关键属性组合计算哈希,只要保证a == b时hash(a) == hash(b)就行。
最后要强调的是,Python哈希函数的设计目标是计算快+碰撞少,而且必须满足“相等的对象哈希值一定相等”的规则,这样才能在字典、集合这类哈希表结构里正常工作。
内容的提问来源于stack exchange,提问作者user20144486

