wim*_*wim 2 python hash cpython
该文档错误地声称
作为用户定义类实例的对象默认情况下可哈希化;他们都比较不相等(除了他们自己),他们的哈希值是
id()
尽管我记得这一次是对的,但是在当前版本的python(v2.7.10,v3.5.0)中,此类对象的哈希值等于其id显然是不正确的。
>>> class A:
... pass
...
>>> a = A()
>>> hash(a)
-9223372036578022804
>>> id(a)
4428048072
Run Code Online (Sandbox Code Playgroud)
在文档的另一部分中,据说哈希是从id 派生的。什么时候/为什么更改实现,哈希现在返回的数字如何“从” id派生?
相关功能似乎是:
Py_hash_t
_Py_HashPointer(void *p)
{
Py_hash_t x;
size_t y = (size_t)p;
/* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid
excessive hash collisions for dicts and sets */
y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4));
x = (Py_hash_t)y;
if (x == -1)
x = -2;
return x;
}
Run Code Online (Sandbox Code Playgroud)
(该代码来自此处,然后用作此处的tp_hash插槽。)那里的注释似乎提供了不直接使用指针(与相同的原因)的原因。实际上,将更改引入功能的提交在此处,并指出更改的原因是:type id
问题#5186: 通过将对象指针向右旋转4位,可以减少没有哈希方法的对象的哈希冲突。
涉及到此问题,这更多地说明了进行更改的原因。
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |