答案 0 :(得分:6)
如果您熟悉C编程和一些高级数学,则可以检查implementation of this function in C。看来,算法XOR会在元组中对每个元素进行哈希处理,并增加一些魔力。
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的 current 实现。其他Python解释器,甚至其他版本的CPython可能具有不同的哈希函数。自2013年以来,一直在使用称为SipHash的特定实现。有关详细说明,请参见PEP 456 -- Secure and interchangeable hash algorithm。
SipHash是具有128位种子和64位输出的加密伪随机函数。...SipHash是一系列伪随机函数(也称为键控哈希函数),它们针对短消息的速度进行了优化。目标应用程序包括网络流量身份验证和针对散列式DoS攻击的防御。
答案 1 :(得分:1)
standard library documentation有一些细节。哈希函数通常具有以下属性:
有写这些的更简单和更困难的方法,以及写慢和慢的方法,但是重要的是不同的值很少会产生相同的哈希值。好的是棘手的,但是您通常并不十分在意实现。
(在Python中,您几乎几乎不需要直接调用hash()
;如果它是用作键的自定义类型的字典实现的一部分,我也不会感到惊讶。Object.__hash__()
documentation说了很多)