簡體   English   中英

boost :: hash_combine在發布模式下失敗

[英]boost::hash_combine fails in release mode

我在自定義哈希對象中使用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和完整的/ Ox優化,並且正在使用自定義哈希在std :: unordered_set中查找位置對象。

我發現了這個錯誤-一個愚蠢的錯誤,但是也許該解決方案對其他人也有用:如您在上面的代碼中看到的,我沒有初始化種子的std :: size_t變量。 在調試模式下,默認情況下將其初始化為0。但是,在優化下不會發生這種情況,從而導致不一致的行為/相同數據的不同哈希值。

有關在發行模式下容易發生的錯誤的更多信息: 調試模式中不存在發行版本中的錯誤的常見原因

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM