【发布时间】:2011-06-24 08:13:06
【问题描述】:
boost::hash_combine 模板函数采用对哈希(称为seed)和对象v 的引用。根据docs,将seed与v的hash组合成
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
我可以看到这是确定性的。我明白为什么要使用 XOR。
我敢打赌,这个加法有助于将相似的值映射得很远,这样探测哈希表就不会崩溃,但有人能解释一下魔法常数是什么吗?
【问题讨论】:
-
鉴于在许多计算机上整数轮换成本与移位大致相同,将表达式转换为:
seed ^= hash_value(v) + 0x9e3779b9 + rotl(seed , 6) + rotr(种子, 2);
标签: c++ algorithm boost hash magic-numbers