函数如何hash()计算元组的哈希值?例如:
t = (1,2,3)
print(hash(t))
Run Code Online (Sandbox Code Playgroud)
给出一个输出
-378539185
Run Code Online (Sandbox Code Playgroud)
如果您熟悉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攻击.
| 归档时间: |
|
| 查看次数: |
768 次 |
| 最近记录: |