std::hash<Key>::operator()
Von cppreference.com
Spezialisierungen von std::hash sollten einen operator() definieren, der
- ein einzelnes Argument key vom Typ
Keynimmt. - einen Wert vom Typ std::size_t zurückgibt, der den Hash-Wert von key repräsentiert.
- Für zwei Parameter
k1undk2, die gleich sind, gilt std::hash<Key>()(k1) == std::hash<Key>()(k2). - Für zwei verschiedene Parameter
k1undk2, die nicht gleich sind, sollte die Wahrscheinlichkeit, dass std::hash<Key>()(k1) == std::hash<Key>()(k2), sehr klein sein und sich 1.0 / std::numeric_limits<size_t>::max() annähern.
Inhalt |
[bearbeiten] Parameter
| key | - | das zu hashende Objekt |
[bearbeiten] Rückgabewert
Ein std::size_t, der den Hash-Wert repräsentiert.
[bearbeiten] Ausnahmen
Hash-Funktionen sollten keine Ausnahmen auslösen.
[bearbeiten] Beispiel
Der folgende Code zeigt, wie die std::hash-Vorlage für eine benutzerdefinierte Klasse spezialisiert werden kann. Die Hash-Funktion verwendet den Fowler–Noll–Vo-Hash-Algorithmus.
Führen Sie diesen Code aus
#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 function constexpr std::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'; }
Ausgabe
12615575401975788567