hash()如何计算元组的哈希值?

Adi*_*dal 4 python hashcode

函数如何hash()计算元组的哈希值?例如:

t = (1,2,3)
print(hash(t))
Run Code Online (Sandbox Code Playgroud)

给出一个输出

-378539185
Run Code Online (Sandbox Code Playgroud)

Lev*_*rov 8

如果您熟悉C编程和一些高级数学,则可以在C中检查此函数实现.似乎算法XORs对元组中每个元素进行哈希处理并增加了一些魔力.

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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是CPython的当前实现.其他Python解释器甚至其他版本的CPython可能具有不同的散列函数.这个特殊的实现,称为SipHash,自2013年以来一直在使用.有关详细说明,请参阅PEP 456 - 安全和可互换的哈希算法.

SipHash是一个加密伪随机函数,具有128位种子和64位输出.... SipHash是一系列伪随机函数(也称为键控散列函数),针对短消息的速度进行了优化.目标应用程序包括网络流量身份验证和防止散列泛滥DoS攻击.

  • 重要的部分是Python逐步获取元组每个元素的哈希值,并将其组合为一个滚动的哈希值,该值成为最终结果。 (3认同)