|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hash::operator() |
Specializations ofstd::hash should define anoperator() that:
Key.k1 andk2 that are equal,std::hash<Key>()(k1)==std::hash<Key>()(k2).k1 andk2 that are not equal, the probability thatstd::hash<Key>()(k1)==std::hash<Key>()(k2) should be very small, approaching1.0/std::numeric_limits<size_t>::max().Contents |
| key | - | the object to be hashed |
Astd::size_t representing the hash value.
Hash functions should not throw exceptions.
The following code shows how to specialize thestd::hash template for a custom class. The hash function usesFowler–Noll–Vo hash algorithm.
#include <cstdint>#include <functional>#include <iostream>#include <string> struct Employee{std::string name;std::uint64_t ID;}; namespace std{template<>class hash<Employee>{public:std::uint64_t operator()(const Employee& employee)const{// computes the hash of an employee using a variant// of the Fowler-Noll-Vo hash functionconstexprstd::uint64_t prime{0x100000001B3};std::uint64_t result{0xcbf29ce484222325}; for(std::uint64_t i{}, ie= employee.name.size(); i!= ie;++i) result=(result* prime)^ employee.name[i]; return result^(employee.ID<<1);}};} int main(){ Employee employee; employee.name="Zaphod Beeblebrox"; employee.ID=42; std::hash<Employee> hash_fn;std::cout<< hash_fn(employee)<<'\n';}
Output:
12615575401975788567