https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94805
Bug ID: 94805
Summary: variant hash algorithm is collision-prone
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: charlie at charliedyson dot net
Target Milestone: ---
The hash implementation for std::variant appears to be "index +
hash(contained_value)". This leads to collisions when working with numeric
types (e.g. a variant of various enums). Ideally a standard hash-combining
operation would be used instead of "+".
Example:
#include <variant>
#include <iostream>
enum E {ZERO, ONE};
int main ()
{
using V = std::variant<E, int>;
V v_enum = ONE;
V v_int = 0;
std::cout << std::hash<V> () (v_enum) << std::endl;
std::cout << std::hash<V> () (v_int) << std::endl;
}
Output is
1
1