Package: g++-10
Version: 10.2.1-1
Severity: normal

On s390x, std::hash returns identical values for large classes of
std::bitset and std::vector<bool>:

    $ cat bug.cc
    #include <bitset>
    #include <functional>
    #include <iostream>
    #include <vector>

    int main() {
      std::bitset<2> a("00"), b("01");
      std::vector<bool> c = {false, true, false, true};
      std::vector<bool> d = {true, false, true, false};

      std::bitset<9> e("000000000"), f("010101010");
      std::vector<bool> g = {true, true, true, true, true, true, true, true, 
true};
      std::vector<bool> h = {false, false, false, true, true,
                             false, false, false, false};

      std::hash<std::bitset<2>> h1;
      std::hash<std::bitset<9>> h2;
      std::hash<std::vector<bool>> h3;

      std::cout << h1(a) << '\n'
                << h1(b) << '\n'
                << h3(c) << '\n'
                << h3(d) << "\n\n"
                << h2(e) << '\n'
                << h2(f) << '\n'
                << h3(g) << '\n'
                << h3(h) << '\n';
    }
    $ g++ -o bug bug.cc
    $ ./bug
    7857072875483051545
    7857072875483051545
    7857072875483051545
    7857072875483051545

    4158372090644325695
    4158372090644325695
    4158372090644325695
    4158372090644325695

It appears that the hash value is completely dependent on the size of
the object in bytes. 1–8-bit values all hash to 7857072875483051545;
9–16-bit values all hash to 4158372090644325695; and though bug.cc
doesn’t demonstrate it, 17-bit values hash to 14756137038141193723.

Attachment: signature.asc
Description: PGP signature

Reply via email to