std::hash does not work correctly on BE machines using the following key types: - std::hash<std::bitset> - std::hash<std::vector<bool>> They both break the 5th rule, a large number of inputs will end up having the same hash: https://en.cppreference.com/w/cpp/utility/hash ### std::bitset ``` #include <iostream> #include <functional> #include <bitset> int main(){ std::bitset<2> a(0b01); std::bitset<2> b(0b10); std::size_t h1 = std::hash<std::bitset<2>>{}(a); std::size_t h2 = std::hash<std::bitset<2>>{}(b); std::cout << h1 << std::endl; std::cout << h2 << std::endl; return 0; ``` Output will be the same on BE machines. The input length calculation is done incorrectly here: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/bitset#L1575 `bitset` writes 0 extended size_t sized values into memory. Reading smaller lengths might return 0 as bytes are not reversed on BE. ### std::vector<bool> ``` #include <iostream> #include <vector> #include <functional> int main(){ std::vector<bool> a= {static_cast<bool>(1), static_cast<bool>(2)}; std::vector<bool> b= {static_cast<bool>(1), static_cast<bool>(2), static_cast<bool>(3)}; std::size_t h1 = std::hash<std::vector<bool>>{}(a); std::size_t h2 = std::hash<std::vector<bool>>{}(b); std::cout << h1 << std::endl; std::cout << h2 << std::endl; return 0; } ``` Similar issue as bitset. vector<bool> writes size_t sized values into memory. https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/vector.tcc#L987 The calculated length in the above link might be smaller than the input and only 0s will get returned as bytes are not reversed on BE.
dup *** This bug has been marked as a duplicate of bug 98731 ***