与hash_combine发生太多冲突

时间:2013-11-13 22:45:42

标签: c++ algorithm boost hash

我正在使用boost::unordered_map一个自定义结构,它或多或少是一个整数向量,并且有一个自定义哈希函数,如下所示:

std::size_t seed = 0;

for (int i = 0; i < myvec.size(); ++i)
  boost::hash_combine(seed, myvec[i]);

return seed;

myvec的大小为3时,我用1M元素1:100 x 1:100 x 1:100填充哈希值(因此myvec的每个元素都是1到100之间的整数)我得到了大约330,000次碰撞。

获得这么多碰撞是否正常,我该怎么做才能避免这种情况?

1 个答案:

答案 0 :(得分:5)

你是对的。 Boost的hash_combine函数对此数据集的效果不佳。您可以使用this code进行测试,显示100万个测试条目的近600,000次碰撞。

这是一个简单的解决方法:

for (int i = 0; i < myvec.size(); ++i)
  boost::hash_combine(seed, myvec[i] * 2654435761);

幻数是接近2 ^ 32 *(sqrt(5)-1)/ 2的素数 - 请参阅Knuth以获得有关扩展间隔的原因的解释。