作者:手机用户2502896257 | 来源:互联网 | 2022-12-09 11:27
1> Lev Zakharov..:
如果您熟悉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;
}
请注意,这是CPython的当前实现.其他Python解释器甚至其他版本的CPython可能具有不同的散列函数.这个特殊的实现,称为SipHash,自2013年以来一直在使用.有关详细说明,请参阅PEP 456 - 安全和可互换的哈希算法.
SipHash是一个加密伪随机函数,具有128位种子和64位输出.... SipHash是一系列伪随机函数(也称为键控散列函数),针对短消息的速度进行了优化.目标应用程序包括网络流量身份验证和防止散列泛滥DoS攻击.
重要的部分是Python逐步获取元组每个元素的哈希值,并将其组合为一个滚动的哈希值,该值成为最终结果。