The unordered associative containers std::unordered_set, std::unordered_multiset, std::unordered_map, std::unordered_multimap use specializations of the template std::hash as the default hash function.
Given a type Key, each specialization std::hash<Key> is either enabled or disabled :
If std::hash<Key> is not provided by the program or the user, it is disabled.
Otherwise, std::hash<Key> is enabled if all following conditions are satisfied:
All following requirements are satisfied:
Hash (with Key as the function call argument type)
The actual hash functions are implementation-dependent and are not required to fulfill any other quality criteria except those specified above. Notably, some implementations use trivial (identity) hash functions which map an integer to itself. In other words, these hash functions are designed to work with unordered associative containers, but not as cryptographic hashes, for example.
Hash functions are only required to produce the same result for the same input within a single execution of a program; this allows salted hashes that prevent collision denial-of-service attacks.
There is no specialization for C strings. std::hash<const char*> produces a hash of the value of the pointer (the memory address), it does not examine the contents of any character array.
Additional specializations for std::pair and the standard container types, as well as utility functions to compose hashes are available in boost::hash.