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中,您几乎从不需要直接调用hash()
;如果它是用作键的自定义类型的字典实现的一部分,我不会感到惊讶。Object.__hash__()
文档提供了更多信息。)
(Py_uhash_t) -1
的准确概率有多大,为什么在那一点上将其设为-2
? - user129393192