Is the floating point specialisation of std::hash
(say, for double
s or float
s) reliable regarding almost-equality? That is, if two values (such as (1./std::sqrt(5.)/std::sqrt(5.))
and .2
) should compare equal but will not do so with the ==
operator, how will std::hash
behave?
So, can I rely on a double
as an std::unordered_map
key to work as expected?
I have seen "Hashing floating point values" but that asks about boost; I'm asking about the C++11 guarantees.
std::hash
has same guarantees for all types over which it can
be instantiated: if two objects are equal, their hash codes will
be equal. Otherwise, there's a very large probability that they
won't. So you can rely on a double
as a key in an
unordered_map
to work as expected: if two doubles are not
equal (as defined by ==
), they will probably have a different
hash (and even if they don't, they're different keys, because
unordered_map
also checks for equality).
Obviously, if your values are the results of inexact
calculations, they aren't appropriate keys for unordered_map
(nor perhaps for any map).