std::hash
| Definiert in Header <bitset>
|
||
| Definiert in Header <coroutine>
|
||
| Definiert in Header <chrono>
|
(seit C++26) |
|
| Definiert in Header <filesystem>
|
||
| Definiert in Header <functional>
|
||
| Definiert in Header <memory>
|
||
| Definiert in Header <optional>
|
||
| Definiert in Header <stacktrace>
|
||
| Definiert in Header <string>
|
||
| Definiert in Header <string_view>
|
||
| Definiert in Header <system_error>
|
||
| Definiert in Header <text_encoding>
|
||
| Definiert in Header <thread>
|
||
| Definiert in Header <typeindex>
|
||
| Definiert in Header <variant>
|
||
| Definiert in Header <vector>
|
||
template< class Key >
struct hash;
|
(seit C++11) | |
Die ungeordneten assoziativen Container std::unordered_set, std::unordered_multiset, std::unordered_map, std::unordered_multimap verwenden Spezialisierungen der Vorlage std::hash als Standard-Hashfunktion.
Gegeben ein Typ Key, ist jede Spezialisierung std::hash<Key> entweder aktiviert oder deaktiviert :
- Wenn
std::hash<Key>nicht durch das Programm oder den Benutzer bereitgestellt wird, ist sie deaktiviert. - Ansonsten ist
std::hash<Key>aktiviert, wenn alle folgenden Bedingungen erfüllt sind:
- Alle folgenden Anforderungen sind erfüllt:
- Hash (mit
Keyals Argumenttyp des Funktionsaufrufs) - DefaultConstructible
- CopyAssignable
- Swappable
- Hash (mit
- Gegeben die folgenden Werte:
h, ein Objekt vom Typstd::hash<Key>.k1undk2, Objekte vom TypKey.
- Alle folgenden Anforderungen sind erfüllt:
- Wenn
k1 == k2trueist, isth(k1) == h(k2)auchtrue. - Sofern
std::hash<Key>keine programmdefinierte Spezialisierung ist, wirdh(k1)niemals eine Ausnahme werfen.
- Wenn
- Ansonsten ist
std::hash<Key>deaktiviert.
Deaktivierte Spezialisierungen erfüllen Hash nicht, erfüllen FunctionObject nicht, und die folgenden Werte sind alle false:
std::is_default_constructible<std::hash<Key>>::valuestd::is_copy_constructible<std::hash<Key>>::valuestd::is_move_constructible<std::hash<Key>>::valuestd::is_copy_assignable<std::hash<Key>>::valuestd::is_move_assignable<std::hash<Key>>::value
Mit anderen Worten, sie existieren, können aber nicht verwendet werden.
Verschachtelte Typen
|
(bis C++20) |
Memberfunktionen
|
Konstruiert ein Hash-Funktionsobjekt
(öffentliche Elementfunktion) |
|
|
berechnet den Hashwert des Arguments
(öffentliche Elementfunktion) |
Standardbibliothek-Spezialisierungen
Jeder Header, der das Template
std::hash
deklariert, stellt auch aktivierte Spezialisierungen von
std::hash
für die folgenden Typen bereit:
- alle cv-unqualifizierten arithmetic types
- alle cv-unqualifizierten enumeration types
- alle cv-unqualifizierten pointer types
- std::nullptr_t
|
Eine freestanding Implementierung muss die oben genannten Spezialisierungen und die standardmäßig deaktivierten Spezialisierungen bereitstellen. |
(since C++20) |
Darüber hinaus bieten einige Header auch andere aktivierte
std::hash
Spezialisierungen für Bibliothekstypen an (siehe
unten
).
|
Für alle
|
(seit C++17) |
Spezialisierungen für Bibliothekstypen
Sprachunterstützungsbibliothek |
|
|
Hash-Unterstützung für
std::coroutine_handle
(Klassen-Template-Spezialisierung) |
|
Diagnosebibliothek |
|
|
(C++11)
|
Hash-Unterstützung für
std::error_code
(Klassen-Template-Spezialisierung) |
|
(C++17)
|
Hash-Unterstützung für
std::error_condition
(Klassen-Template-Spezialisierung) |
|
(C++11)
|
Hash-Unterstützung für
std::type_index
(Klassen-Template-Spezialisierung) |
|
Hash-Unterstützung für
std::stacktrace_entry
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::basic_stacktrace
(Klassen-Template-Spezialisierung) |
|
Speicherverwaltungsbibliothek |
|
|
(C++11)
|
Hash-Unterstützung für
std::unique_ptr
(Klassen-Template-Spezialisierung) |
|
(C++11)
|
Hash-Unterstützung für
std::shared_ptr
(Klassen-Template-Spezialisierung) |
|
(C++26)
|
Hash-Unterstützung für
std::indirect
(Klassen-Template-Spezialisierung) |
Bibliothek für allgemeine Hilfsmittel |
|
|
(C++17)
|
Hash-Unterstützung für
std::optional
(Klassen-Template-Spezialisierung) |
|
(C++17)
|
Hash-Unterstützung für
std::variant
(Klassen-Template-Spezialisierung) |
|
(C++17)
|
Hash-Unterstützung für
std::monostate
(Klassen-Template-Spezialisierung) |
|
(C++11)
|
Hash-Unterstützung für
std::bitset
(Klassen-Template-Spezialisierung) |
Container-Bibliothek |
|
|
(C++11)
|
Hash-Unterstützung für
std::vector<bool>
(Klassen-Template-Spezialisierung) |
String-Bibliothek |
|
|
(C++11)
|
Hash-Unterstützung für Strings
(Klassen-Template-Spezialisierung) |
|
(C++17)
(C++17)
(C++20)
(C++17)
(C++17)
|
Hash-Unterstützung für String-Views
(Klassen-Template-Spezialisierung) |
Textverarbeitungsbibliothek |
|
|
(C++26)
|
Hash-Unterstützung für
std::text_encoding
(Klassen-Template-Spezialisierung) |
Zeitbibliothek |
|
|
Hash-Unterstützung für
std::chrono::duration
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::time_point
(Klassen-Template-Spezialisierung) |
|
|
(C++26)
|
Hash-Unterstützung für
std::chrono::day
(Klassen-Template-Spezialisierung) |
|
(C++26)
|
Hash-Unterstützung für
std::chrono::month
(Klassentemplate-Spezialisierung) |
|
(C++26)
|
Hash-Unterstützung für
std::chrono::year
(Klassen-Template-Spezialisierung) |
|
(C++26)
|
Hash-Unterstützung für
std::chrono::weekday
(Klassen-Template-Spezialisierung) |
|
Hash-Unterstützung für
std::chrono::weekday_indexed
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::weekday_last
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::month_day
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::month_day_last
(Klassen-Templatespezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::month_weekday
(Klassen-Templatespezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::month_weekday_last
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::year_month
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::year_month_day
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::year_month_day_last
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::year_month_weekday
(Klassen-Templatespezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::year_month_weekday_last
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::zoned_time
(Klassen-Template-Spezialisierung) |
|
|
Hash-Unterstützung für
std::chrono::leap_second
(Klassen-Template-Spezialisierung) |
|
Eingabe-/Ausgabebibliothek |
|
|
Hash-Unterstützung für
std::filesystem::path
(Klassentemplatespezialisierung) |
|
Nebenläufigkeitsunterstützungsbibliothek |
|
|
(C++11)
|
Hash-Unterstützung für
std::thread::id
(Klassentemplatespezialisierung) |
Hinweise
Die eigentlichen Hash-Funktionen sind implementierungsabhängig und müssen keine anderen Qualitätskriterien erfüllen als die oben genannten. Insbesondere verwenden einige Implementierungen triviale (Identitäts-) Hash-Funktionen, die eine Ganzzahl auf sich selbst abbilden. Mit anderen Worten, diese Hash-Funktionen sind für die Verwendung mit ungeordneten assoziativen Containern konzipiert, jedoch nicht als kryptographische Hash-Funktionen, zum Beispiel.
Hash-Funktionen sind nur dazu verpflichtet, für dieselbe Eingabe innerhalb einer einzelnen Programmdurchführung dasselbe Ergebnis zu liefern; dies ermöglicht gesalzene Hashes, die Kollisions-DoS-Angriffe verhindern.
Es gibt keine Spezialisierung für C-Strings. std :: hash < const char * > erzeugt einen Hash des Zeigerwerts (der Speicheradresse), es werden nicht die Inhalte des Zeichenarrays untersucht.
Zusätzliche Spezialisierungen für
std::pair
und die Standard-Containertypen, sowie Hilfsfunktionen zum Kombinieren von Hashes sind verfügbar in
boost::hash
.
Beispiel
#include <cstddef> #include <functional> #include <iomanip> #include <iostream> #include <string> #include <unordered_set> struct S { std::string first_name; std::string last_name; bool operator==(const S&) const = default; // seit C++20 }; // Vor C++20. // bool operator==(const S& lhs, const S& rhs) // { // return lhs.first_name == rhs.first_name && lhs.last_name == rhs.last_name; // } // Benutzerdefinierter Hash kann ein eigenständiges Funktionsobjekt sein. struct MyHash { std::size_t operator()(const S& s) const noexcept { std::size_t h1 = std::hash<std::string>{}(s.first_name); std::size_t h2 = std::hash<std::string>{}(s.last_name); return h1 ^ (h2 << 1); // oder boost::hash_combine verwenden } }; // Benutzerdefinierte Spezialisierung von std::hash kann im Namespace std injiziert werden. template<> struct std::hash<S> { std::size_t operator()(const S& s) const noexcept { std::size_t h1 = std::hash<std::string>{}(s.first_name); std::size_t h2 = std::hash<std::string>{}(s.last_name); return h1 ^ (h2 << 1); // oder boost::hash_combine verwenden } }; int main() { std::string str = "Meet the new boss..."; std::size_t str_hash = std::hash<std::string>{}(str); std::cout << "hash(" << std::quoted(str) << ") =\t" << str_hash << '\n'; S obj = {"Hubert", "Farnsworth"}; // Verwendung des eigenständigen Funktionsobjekts. std::cout << "hash(" << std::quoted(obj.first_name) << ", " << std::quoted(obj.last_name) << ") =\t" << MyHash{}(obj) << " (mit MyHash) oder\n\t\t\t\t" << std::hash<S>{}(obj) << " (mit injizierter Spezialisierung)\n"; // Benutzerdefinierter Hash ermöglicht die Verwendung benutzerdefinierter Typen in ungeordneten Containern. // Das Beispiel verwendet die oben injizierte std::hash<S>-Spezialisierung, // um stattdessen MyHash zu verwenden, übergeben Sie es als zweites Template-Argument. std::unordered_set<S> names = {obj, {"Bender", "Rodriguez"}, {"Turanga", "Leela"}}; for (auto const& s: names) std::cout << std::quoted(s.first_name) << ' ' << std::quoted(s.last_name) << '\n'; }
Mögliche Ausgabe:
hash("Treffe den neuen Chef...") = 10656026664466977650
hash("Hubert", "Farnsworth") = 12922914235676820612 (mit MyHash) oder
12922914235676820612 (mit injizierter Spezialisierung)
"Bender" "Rodriguez"
"Turanga" "Leela"
"Hubert" "Farnsworth"
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2119 | C++11 | Spezialisierungen für erweiterte Ganzzahltypen fehlten | bereitgestellt |
| LWG 2148 | C++11 | Spezialisierungen für Aufzählungen fehlten | bereitgestellt |
| LWG 2543 | C++11 |
std::hash
war möglicherweise nicht SFINAE-freundlich
|
SFINAE-freundlich gemacht |
| LWG 2817 | C++11 | Spezialisierung für std::nullptr_t fehlte | bereitgestellt |