- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在自定义哈希对象中使用 boost::hash_combine 为 std::array 定义二维网格中的位置。
struct PositionHasher {
std::size_t operator()(const std::array<int, 2> &position) const {
std::size_t seed;
boost::hash_combine(seed, position[0]);
boost::hash_combine(seed, position[1]);
return seed;
};
};
对 boost::hash combine 的调用等同于:
seed ^= position[0] + 0x9e3779b9 + (seed << 6) + (seed >> 2);
seed ^= position[1] + 0x9e3779b9 + (seed << 6) + (seed >> 2);
在 Release模式下构建我的应用程序时,我得到了与 Debug模式下不同的散列行为。我怀疑我实际上对相同的 std::array 对象有不同的值。即使我从函数中删除 0x9e3779b9,此行为仍然存在。
这怎么可能?我正在使用 VS2015 和完整的/Ox 优化,并且正在使用自定义哈希来查找 std::unordered_set 中的位置对象。
最佳答案
我发现了这个错误 - 一个愚蠢的错误,但也许这个解决方案对其他人有帮助:正如您在上面的代码中看到的,我没有为种子初始化 std::size_t 变量。在 Debug模式下,它默认初始化为 0。但是,这不会在优化下发生,导致不一致的行为/相同数据的不同哈希值。
有关 Release模式中容易发生的错误的更多信息:Common reasons for bugs in release version not present in debug mode
关于c++ - boost::hash_combine 在 Release模式下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49213348/
目前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 +
我是一名优秀的程序员,十分优秀!