std::hash<Key>::operator()
Aus cppreference.com
|
|
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
<metanoindex/>
Specializations of std::hash should define an operator() that:
- Takes a single argument
keyof typeKey. - Returns a value of type
size_tthat represents the hash value ofkey. - For two parameters
k1andk2that are equal,std::hash<Key>()(k1) == std::hash<Key>()(k2). - For two different parameters
k1andk2that 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().
Parameter
| key | - | the object to be hashed |
Rückgabewert
a size_t representing the hash value
Ausnahmen
Hash functions should not throw exceptions.
Beispiel
The following code shows how to specialize the std::hash template for a custom class.
#include <functional>
#include <iostream>
#include <string>
struct Employee {
std::string name;
unsigned int ID;
};
namespace std {
template <>
class hash<Employee> {
public:
size_t operator()(const Employee &employee) const
{
// computes the hash of an employee using a variant
// of the Fowler-Noll-Vo hash function
size_t result = 2166136261;
for (size_t i = 0, ie = employee.name.size(); i != ie; ++i) {
result = (result * 16777619) ^ 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:
177237019