与hash_combine发生太多碰撞
getting too many collisions with hash_combine
我正在使用带有自定义结构的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 了解为什么可以扩展区间。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 错误:字符数组的初始值设定项太多
- 对象实例化调用构造函数的次数太多
- Levenshtein 两个文件的距离花费了太多时间
- 我有三个 getline,但是一旦编译,输入就太多了
- 将使用太多的纹理插值器 - 带旋转的着色器
- C/C++:socket() 创建在循环中失败,打开的文件太多
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- C++:数组<>初始值设定项太多
- GLib-ERROR:为GWakeup创建管道:打开的文件太多
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 我会导致太多内存泄漏,以至于我的计算机无响应吗?
- ZeroMq:打开的文件太多.在同一对象上连续增长的fd使用数
- 读取串行命令花费太多时间
- 为什么 Boost unordered_map 在第一次插入时需要太多时间?
- BRK(0) 花费的时间是否太多?
- Valgrind 声称内存释放中的自由空间太多
- 如果分支太多C++
- 压缩太多文件
- 与hash_combine发生太多碰撞