Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在CPython中-1和-2都散列为-2?_Python_Hash_Cpython - Fatal编程技术网

为什么在CPython中-1和-2都散列为-2?

为什么在CPython中-1和-2都散列为-2?,python,hash,cpython,Python,Hash,Cpython,可能重复: 如果是Python,为什么-1和-2都散列到相同的数字 既然如此,Python如何区分这两个数字 >>> -1 is -2 False >>> hash(-1) is hash(-2) True >>> hash(-1) -2 >>> hash(-2) -2 -1是CPython的C级保留值,它阻止哈希函数生成-1的哈希值。正如DSM所指出的,IronPython和PyPy中的情况不同,其中hash(-1)!

可能重复:

如果是Python,为什么
-1
-2
都散列到相同的数字

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

>>> -1 is -2
False
>>> hash(-1) is hash(-2)
True
>>> hash(-1)
-2
>>> hash(-2)
-2

-1
是CPython的C级保留值,它阻止哈希函数生成
-1
的哈希值。正如DSM所指出的,IronPython和PyPy中的情况不同,其中
hash(-1)!=散列(-2)

见:

如果在C扩展模块中写入类型并提供
tp\u散列
方法,则必须避免
-1
-如果返回
-1
,Python将假定 你本想犯个错误的

如果您用纯Python编写一个类,并提供一个
\uuuuuuuuuuuuuuuuuuuuuuuu
方法, 谢天谢地,没有这样的要求。但那是因为C代码 调用您的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu散列
方法的
\uuuu hash\uuuu
返回
-1
,然后应用于对象的
hash()
将实际返回
-2

这实际上只是从以下位置重新打包信息:

散列值
-1
是保留的(用于标记C中的错误) 实施)。如果哈希算法生成这个值,我们只需 改用
-2

您也可以在源代码中看到这一点。例如,对于Python3的
int
对象,它位于:


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

>>> -1 is -2
False
>>> hash(-1) is hash(-2)
True
>>> hash(-1)
-2
>>> hash(-2)
-2
由于所有哈希函数都将较大的输入空间映射到较小的输入空间,因此无论哈希函数有多好,冲突总是存在的。例如,考虑散列字符串。如果哈希代码是32位整数,则有2^32(略多于40亿)个哈希代码。如果考虑所有长度为6的ASCII字符串,则在输入空间中有(2 ^ 7)^ 6(正好低于4兆4000亿)不同的项。只有这一组,你保证会有很多很多碰撞,不管你有多好。添加Unicode字符和长度不限的字符串

因此,哈希代码只提示对象的位置,然后进行相等性测试以测试候选键。要在哈希表集中实现成员资格测试,哈希代码将为您提供“bucket”编号,以便在其中搜索值。但是,具有相同哈希代码的所有集合项都在bucket中。为此,您还需要一个平等测试来区分bucket中的所有候选对象

这个散列码和等式对偶性在中得到了暗示。在其他语言/框架中,有一条准则/规则,即如果提供自定义哈希代码函数,还必须提供自定义相等性测试(在与哈希代码函数相同的字段上执行)



事实上,今天的Python版本正好解决了这一问题,它提供了一个安全补丁,解决了将此(相同的散列值,但规模很大)用作拒绝服务攻击时的效率问题-

这是一个已知的问题-我想这里已经有一个问题了…Python 2.7.3代码链接(用于整数):您可能想回答第二个问题(Python如何告诉appart这两个数字)。由于所有哈希函数都将较大的输入空间映射到较小的输入空间,因此无论哈希函数有多好,冲突总是存在的。因此,散列代码只提示对象的位置,然后进行相等性测试来测试候选密钥IronPython2.6.0.20和PyPy1.7.0中的散列(-2)。当问题结束时,点不会消失,只有当它被删除时才会消失。哦,酷。我将放弃这一评论。谢谢