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