Was ist die Standard-Hash-Funktion in C ++ std :: unordered_map?
Ich bin mit
unordered_map<string, int>
und
unordered_map<int, int>
Welche hash-Funktion verwendet wird, in jedem Fall und was ist die chance einer Kollision in jedem Fall?
Ich werde einfügen eindeutige Zeichenfolge und einzigartigen int als Schlüssel in jedem Fall jeweils.
Ich bin daran interessiert zu wissen, den Algorithmus der hash-Funktion im Fall von string-und int-Schlüssel und Ihre Kollision stats.
Kommentar zu dem Problem
Ich denke, es ist bis zum standard. Nicht sicher, was für eine unorderd_map ist.
unordered_map ist wie die hash-Tabelle...Hab Standard-hash-Funktionen ändern in C++98 vs C++11?
Sie hat dieses C++11, aber die Frage über TR1. Welche ist es?
Sorry @John Dibling, ich tagged it C++11. Ich habe bearbeitet den Titel zu, da ich denke, die Frage hat mehr Bedeutung, Art und Weise; jetzt Antworten verweisen auf einen formellen standard. Fühlen Sie sich frei, um wieder zu ändern; ich sehe, Sie haben mehr Erfahrung auf dieser Website, als ich.
Warum dann beziehen Sie sich auf die
tr1
namespace? InformationsquelleAutor der Frage Medicine | 2013-10-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion Objekt
std::hash<>
verwendet wird.Standard-Spezialisierungen existieren für alle built-in Typen, und einige andere standard-Bibliothek-Typen
wie
std::string
undstd::thread
. Siehe den link für die vollständige Liste.Für andere Arten verwendet werden, die in einem
std::unordered_map
Sie haben sich zu spezialisierenstd::hash<>
oder erstellen Sie Ihre eigene function-Objekt.Die chance für eine Kollision ist vollständig von der Implementierung abhängig, aber in Anbetracht der Tatsache, dass Ganzzahlen beschränkt sind zwischen einem definierten Bereich, während die Streicher sind theoretisch unendlich lange, ich würde sagen, es ist eine viel bessere chance für eine Kollision mit strings.
Als für die Implementierung in GCC, die Spezialisierung für builtin-Typen nur gibt das bit-Muster. Hier ist, wie Sie definiert sind, in
bits/functional_hash.h
:Die Spezialisierung für
std::string
ist definiert als:Einige weitere Suche führt uns zu:
_Hash_bytes
ist eine externe Funktion auslibstdc++
. Ein bisschen mehr Suche führte mich zu diese Datei, in dem es heißt:Also die Standard-hashing-Algorithmus, der GCC verwendet für strings ist MurmurHashUnaligned2.
InformationsquelleAutor der Antwort Avidan Borisov
Obwohl die hashing-algorithmen, compiler-abhängig, ich werde es für GCC-C++11. @Avidan Borisov scharfsinnig entdeckt , dass die GCC-Hash-Algorithmus für strings verwendet wird "MurmurHashUnaligned2," von Austin Appleby. Ich habe einige suchen und fand eine gespiegelte Kopie von GCC auf Github. Daher:
Die GCC-C++11 Hash-Funktionen verwendet, für
unordered_map
(eine hash-Tabelle-Vorlage) undunordered_set
(hash-set-Vorlage) zu sein scheinen wie folgt.Code:
Für zusätzliche Hash-Funktionen, einschließlich
djb2
, und die 2 Versionen des K&R Hash-Funktionen (offensichtlich schrecklich, aber ziemlich gut), siehe meine andere Antwort hier: https://stackoverflow.com/a/45641002/4561887.InformationsquelleAutor der Antwort Gabriel Staples