Namespaces
Variants

std:: hash

From cppreference.net
Utilities library
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:
  • Gegeben sind folgende Werte:
  • h , ein Objekt vom Typ std::hash<Key> .
  • k1 und k2 , Objekte vom Typ Key .
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 :

**Anmerkung:** Da der gesamte Inhalt innerhalb von ` ` Tags liegt (was als Code-ähnliche Umgebung betrachtet werden kann) und spezifische C++-Begriffe enthält, wurde gemäß den Anweisungen kein Text übersetzt. Die HTML-Struktur und alle Tags wurden unverändert beibehalten.

Mit anderen Worten, sie existieren, können aber nicht verwendet werden.

Inhaltsverzeichnis

Verschachtelte Typen

Typ Definition
argument_type (veraltet in C++17) Key
result_type (veraltet in C++17) std::size_t
(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:

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 std::hash -Spezialisierungen, die von der Standardbibliothek bereitgestellt werden, mit Ausnahme der folgenden, sind alle ihre Memberfunktionen noexcept :

(seit C++26)
(seit C++17)

Spezialisierungen für Bibliothekstypen

Sprachunterstützungsbibliothek
Hash-Unterstützung für std::coroutine_handle
(Klassen-Template-Spezialisierung)
Diagnosebibliothek
Hash-Unterstützung für std::error_code
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::error_condition
(Klassen-Template-Spezialisierung)
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
Hash-Unterstützung für std::unique_ptr
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::shared_ptr
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::indirect
(Klassen-Template-Spezialisierung)
Bibliothek für allgemeine Hilfsmittel
Hash-Unterstützung für std::optional
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::variant
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::monostate
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::bitset
(Klassen-Template-Spezialisierung)
Container-Bibliothek
Hash-Unterstützung für std::vector<bool>
(Klassen-Template-Spezialisierung)
String-Bibliothek
Hash-Unterstützung für Strings
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für String-Views
(Klassen-Template-Spezialisierung)
Textverarbeitungsbibliothek
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)
Hash-Unterstützung für std::chrono::day
(Klassen-Template-Spezialisierung)
Hash-Unterstützung für std::chrono::month
(Klassentemplate-Spezialisierung)
Hash-Unterstützung für std::chrono::year
(Klassen-Template-Spezialisierung)
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
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