[英]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.