boost :: hash_combine在发布模式下失败

时间:2018-03-10 19:48:56

标签: c++ optimization boost hash c++14

我在自定义哈希对象中使用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中的位置对象。

1 个答案:

答案 0 :(得分:1)

我发现了这个错误 - 这是一个愚蠢的错误,但也许该解决方案对其他人有帮助:正如您在上面的代码中所看到的,我没有为种子初始化std :: size_t变量。在调试模式下,它默认初始化为0.但是,这在优化下不会发生,导致相同数据的行为不一致/不同的哈希值。

有关在发布模式下可能发生的错误的更多信息:Common reasons for bugs in release version not present in debug mode