我在自定义哈希对象中使用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);
在发布模式下构建我的应用程序时,我得到的散列行为与调试模式不同。我怀疑我实际上对于相同的std :: array对象有不同的值。即使我从函数中删除0x9e3779b9,此行为仍然存在。
这怎么可能?我正在使用VS2015和full / Ox优化,我正在使用自定义哈希来查找std :: unordered_set中的位置对象。
答案 0 :(得分:1)
我发现了这个错误 - 这是一个愚蠢的错误,但也许该解决方案对其他人有帮助:正如您在上面的代码中所看到的,我没有为种子初始化std :: size_t变量。在调试模式下,它默认初始化为0.但是,这在优化下不会发生,导致相同数据的行为不一致/不同的哈希值。
有关在发布模式下可能发生的错误的更多信息:Common reasons for bugs in release version not present in debug mode