您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么在CPython中-1和-2都哈希为-2?

为什么在CPython中-1和-2都哈希为-2?

-1cpythonC语言级别的保留值,它防止哈希函数能够产生的哈希值-1。如DSM所述,IronPython和PyPy中的情况并非如此hash(-1) !=hash(-2)

看到这个Quora答案

如果在C扩展模块中编写类型并提供tp_hash 方法,则必须避免-1-如果返回-1,Python将假定您打算抛出错误

如果您使用纯Python编写类并提供__hash__方法,那么就没有这种要求了。但这是因为调用您的__hash__方法的C代码为您完成了此操作- 如果您 __hash__返回了-1,那么hash()应用于您的对象实际上就会返回-2

这实际上只是重新包装了effbot中的信息:

哈希值-1是保留的(用于标记C实现中的错误)。如果哈希算法生成了该值,我们只需使用-2

您也可以在源代码中看到它。例如,对于Python 3的int对象,这在哈希实现的末尾:

if (x == (Py_uhash_t)-1)
    x = (Py_uhash_t)-2;
return (Py_hash_t)x;

既然如此,Python如何将这两个数字区分开?

由于所有哈希函数将较大的输入空间映射到较小的输入空间,因此,无论哈希函数性能如何,总是会发生冲突。例如,考虑哈希字符串。如果哈希码是32位整数,则您有2 ^ 32(略高于40亿个)哈希码。如果考虑所有长度为6的ASCII字符串,则在输入空间中将有(2 ^ 7)^ 6(小于4.4万亿个)不同的项目。仅使用此设置,无论您多么出色,都可以确保您有很多很多的碰撞。添加Unicode字符和无限长度的字符串!

因此,哈希码仅 提示 对象的位置,随后进行相等性测试以测试候选键。为了在哈希表集中实现成员资格测试,哈希码为您提供了在其中搜索值的“存储桶”编号。但是,所有具有相同哈希码的设置项都位于存储桶中。为此,您还需要进行相等性测试以区分存储桶中的所有候选对象。

Cash文档中关于可哈希对象的内容暗示了这种哈希代码和相等对偶性。在其他语言/框架中,有一条准则/规则,如果您提供自定义哈希码功能,则还必须提供自定义相等性测试(与哈希码功能在相同的字段上执行)。

确实,今天的Python版本正是通过使用安全补丁来解决此问题的,该补丁解决了效率问题(将相同的哈希值,但规模很大)用作拒绝服务攻击时的效率问题-http://mail.python.org /pipermail/python- list/2012-April/1290792.html

python 2022/1/1 18:44:52 有311人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶