为什么 Python 中 hash(-1) 和 hash(-2) 都是 -2?
数据小陈
结论
在 CPython 中,-1 是哈希函数的错误标记。整数 -1 正常计算出的哈希值也是 -1,因此实现会将它改为 -2。整数 -2 的哈希值本来就是 -2,所以两者会发生碰撞。
为什么要保留 -1
CPython 的 C API 用有符号整数类型 Py_hash_t 表示哈希值。对于类型哈希函数 tp_hash,返回 -1 表示计算出错;计算成功时,不能把 -1 作为普通哈希值返回。CPython 的扩展类型文档也展示了这一处理方式:结果为 -1 时,将其改为 -2。扩展类型文档
整数的哈希值通常与其数值相同。因此,-1 的正常哈希结果会与错误标记冲突,必须映射到其他值:
hash(-1) # -2:原结果 -1 被避开
hash(-2) # -2:原结果就是 -2
这会影响字典或集合吗?
不会影响它们的正确性。哈希值相同不代表对象相等;哈希表遇到碰撞时仍会比较键是否相等。Python 要求相等的对象具有相同的哈希值,但不要求不相等的对象哈希值不同。数据模型文档
因此,hash(-1) == hash(-2) 是为了区分正常哈希结果和 C 层错误标记而接受的碰撞,并不表示 -1 == -2。
备注:内容仅供参考。
