the default hash function for floats/doubles is not very good.
Author: nicebyteCreated Aug 27, 2024Updated May 23, 2025
the default hash for floats works by casting the value to size_t:
template <> struct hash<float>
{ size_t operator()(float val) const { return static_cast<size_t>(val); } };this is quite bad because anything that is between two integers gets hashed to the same value. my hash table essentially turned into a linear array because most of the values happened to be in the [0; 1] range.
the same applies to hashes for other floating point types (double, long double etc.).
when fixing this, keep in mind that floating point numbers have two representations for 0 (0 and -0) - those two bit patterns should hash to the same value because they represent the same number.
Source: electronicarts/EASTL