与hash_combine发生太多碰撞

getting too many collisions with hash_combine

本文关键字:太多 碰撞 combine hash      更新时间:2023-10-16

我正在使用带有自定义结构的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 次碰撞。

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

你是对的。Boost的hash_combine函数对于这个数据集表现不佳。您可以使用此代码进行测试,该代码显示 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 了解为什么可以扩展区间。