为什么在CPython中-1和-2都哈希为-2?[重复]

为什么在CPython中-1和-2都哈希为-2?[重复],第1张

为什么在CPython中-1和-2都哈希为-2?[重复]

-1
是CPython
C语言级别的保留值,它防止哈希函数能够产生的哈希值
-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万亿个)不同的项目。仅使用此设置,无论您多么出色,都可以确保您有很多很多的碰撞。添加Unipre字符和无限长度的字符串!

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

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


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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5662035.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存