PAYATHON 2026

为什么 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。

备注:内容仅供参考。