- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将 boost::unordered_map
与自定义结构一起使用,该结构或多或少是一个整数 vector ,并具有如下所示的自定义哈希函数:
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
函数对这个数据集的表现很差。您可以使用 this code 进行测试对于一百万个测试条目,它显示了将近 600,000 次碰撞。
这是一个简单的修复:
for (int i = 0; i < myvec.size(); ++i)
boost::hash_combine(seed, myvec[i] * 2654435761);
魔数(Magic Number)是接近 2^32 * (sqrt(5)-1)/2 的质数 -- 参见 Knuth解释为什么这样可以扩大间隔。
关于c++ - 与 hash_combine 发生太多冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966041/
目前Boost有hash_combine函数输出32位无符号整数(准确的说是size_t)。一些引用: http://www.boost.org/doc/libs/1_43_0/doc/html/ha
我将 boost::unordered_map 与自定义结构一起使用,该结构或多或少是一个整数 vector ,并具有如下所示的自定义哈希函数: std::size_t seed = 0; for (
当使用 boost 库时,函数 boost::hash_combine 的工作方式如下: seed ^= hash_value(v) + 0x9e3779b9 + (seed > 2); http:/
我在自定义哈希对象中使用 boost::hash_combine 为 std::array 定义二维网格中的位置。 struct PositionHasher { std::size_t op
在为整数寻找一些确定性(多次运行,多台机器)哈希器时,我偶然发现了 boost::hash_combine(size_t & seed, T const& v)。不幸的是,在 documentatio
我正在寻找具有关联属性的 hash_combine 函数。 例如,我希望能够依次组合值 a、b、c、d 以获得序列的哈希键,或者组合 a 和 b,然后组合 c 和 d,然后组合结果。这两种方法应该给出
我在其他帖子中读到这似乎是组合散列值的最佳方式。有人可以分解一下并解释为什么这是最好的方法吗? template inline void hash_combine(std::size_t& seed
boost::hash_combine 模板函数采用对散列(称为seed)和对象v 的引用。根据docs , 它结合了 seed 和 v by 的哈希 seed ^= hash_value(v) +
本例中的魔数(Magic Number)是 0x9e3779b9,以 10 为基数是 2654435769。代码有什么原因吗 seed ^= hash_value(v) + 0x9e3779b9 +
我是一名优秀的程序员,十分优秀!