std:: hash
|
Definiert in Header
<bitset>
|
||
|
Definiert in Header
<coroutine>
|
(seit C++20)
|
|
|
Definiert in Header
<chrono>
|
(seit C++26)
|
|
|
Definiert in Header
<filesystem>
|
(seit C++17)
|
|
|
Definiert in Header
<functional>
|
||
|
Definiert in Header
<memory>
|
||
|
Definiert in Header
<optional>
|
(seit C++17)
|
|
|
Definiert in Header
<stacktrace>
|
(seit C++23)
|
|
|
Definiert in Header
<string>
|
||
|
Definiert in Header
<string_view>
|
(seit C++17)
|
|
|
Definiert in Header
<system_error>
|
||
|
Definiert in Header
<text_encoding>
|
(seit C++26)
|
|
|
Definiert in Header
<thread>
|
||
|
Definiert in Header
<typeindex>
|
||
|
Definiert in Header
<utility>
|
(seit C++26)
|
|
|
Definiert in Header
<variant>
|
(seit C++17)
|
|
|
Definiert in Header
<vector>
|
||
|
template
<
class
Key
>
struct hash ; |
(seit C++11) | |
Die aktivierten Spezialisierungen der
hash
-Vorlage definieren ein Funktionsobjekt, das eine
Hash-Funktion
implementiert.
Für einen Typ
Key
ist jede Spezialisierung
std::hash<Key>
entweder
aktiviert
oder
deaktiviert
:
-
Wenn
std::hash<Key>nicht vom Programm oder Benutzer bereitgestellt wird, ist es deaktiviert. -
Andernfalls ist
std::hash<Key>aktiviert, wenn alle folgenden Bedingungen erfüllt sind:
-
- Alle folgenden Anforderungen sind erfüllt:
-
-
Hash
(mit
Keyals Funktionsaufrufargumenttyp) - DefaultConstructible
- CopyAssignable
- Swappable
-
Hash
(mit
- Gegeben sind folgende Werte:
-
-
h
, ein Objekt vom Typ
std::hash<Key>. -
k1
und
k2
, Objekte vom Typ
Key.
-
h
, ein Objekt vom Typ
-
Alle folgenden Anforderungen sind erfüllt:
- Wenn k1 == k2 den Wert true hat, dann hat auch h ( k1 ) == h ( k2 ) den Wert true .
-
Sofern es sich bei
std::hash<Key>nicht um eine programmdefinierte Spezialisierung handelt, wird h ( k1 ) niemals eine Exception werfen.
-
Andernfalls ist
std::hash<Key>deaktiviert.
Deaktivierte Spezialisierungen erfüllen nicht Hash , erfüllen nicht FunctionObject , und folgende Werte sind alle false :
- std:: is_default_constructible < std :: hash < Key >> :: value
- std:: is_copy_constructible < std :: hash < Key >> :: value
- std:: is_move_constructible < std :: hash < Key >> :: value
- std:: is_copy_assignable < std :: hash < Key >> :: value
- std:: 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 |