tup的散列函数是怎样的

2024-09-28 01:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

根据我在Python中的理解,由于元组是不可变的,所以它们应该是散列的,hash()函数应该对它们起作用。然而,情况似乎并非如此,因为当它们包含诸如列表或dicts之类的项时,哈希函数就会出现如下所示的问题。在

这是有效的:

>>> t = (1, 2, 'name', 'Subhayan', 'age', 32, 'sex', 'male')
>>> hash(t)
3584505648807432737

这不起作用:

^{pr2}$

所以我的问题是散列函数如何在内部操作?它是否循环遍历元组并尝试散列各个组件?在

有人能给我一些参考资料吗。在


Tags: 函数name列表age情况组件hashmale
1条回答
网友
1楼 · 发布于 2024-09-28 01:23:02

是的,不可变容器的哈希取包含对象的哈希。在

对于元组,请参见Objects/tupleobject.c源代码,特别是^{} function

static Py_hash_t
tuplehash(PyTupleObject *v)
{
    Py_uhash_t x;  /* Unsigned for defined overflow behavior. */
    Py_hash_t y;
    Py_ssize_t len = Py_SIZE(v);
    PyObject **p;
    Py_uhash_t mult = _PyHASH_MULTIPLIER;
    x = 0x345678UL;
    p = v->ob_item;
    while ( len >= 0) {
        y = PyObject_Hash(*p++);
        if (y == -1)
            return -1;
        x = (x ^ y) * mult;
        /* the cast might truncate len; that doesn't change hash stability */
        mult += (Py_hash_t)(82520UL + len + len);
    }
    x += 97531UL;
    if (x == (Py_uhash_t)-1)
        x = -2;
    return x;
}

在Python中,忽略C int类型溢出,等效值为:

^{pr2}$

“幻数”是为了确保元组哈希为内容哈希中的小更改生成大范围的值。在

这毕竟是最符合逻辑的实现;哈希应该反映包含的值,当您针对另一个元组测试相等性时,所包含的值也会针对另一个元组中的对象进行测试;哈希和相等功能是密切相关的。在

元组可以引用任何类型的对象;元组本身不能被更改,但这并不意味着您不能更改它引用的对象。因此,元组的哈希能力取决于元组引用的对象的哈希能力。在

相关问题 更多 >

    热门问题