Wenn ich std::hash
mit libstdc++
und dann eins mit der kommenden C++11
VS 2012-Bibliothek verwendet habe - würden sie übereinstimmen?
Ich gehe davon aus, dass Hash-Implementierungen nicht Teil der C ++ - Spezifikation sind und nach Verteilung variieren können?
Der Standard sagt das nur:
20.8.12 Klassenvorlagenhash Die in 23.5 definierten ungeordneten assoziativen Container verwenden Spezialisierungen des Klassenvorlagenhashs als Standard-Hash-Funktion. Für alle Objekttypen Schlüssel, für den es existiert ein Spezialisierungs-Hash, derInstantiierungs-Hash soll:
- erfüllt die Hash-Anforderungen (17.6.3.4), mit Key als Argumenttyp für den Funktionsaufruf, den DefaultConstructible-Anforderungen (Tabelle 19), die CopyAssignable-Anforderungen (Tabelle 23),
- ist austauschbar (17.6.3.2) für lvalues,
- liefert zwei verschachtelte Typen result_type und argument_type, die Synonyme für size_t bzw. Key
sein sollen- erfüllen die Anforderung, dass, wenn k1 == k2 wahr ist, h (k1) == h (k2) auch wahr ist, wobei h ein Objekt vom Typ hash ist und k1 und k2 sind Objekte vom Typ Schlüssel.
in 17.6.3.4 ist dies von größter Wichtigkeit (Tabelle 26):
Es werden keine Ausnahmen ausgelöst. Der zurückgegebene Wert hängt nur davon ab das Argument k. [Note: Also alle Bewertungen des Ausdrucks h (k) Mit demselben Wert für k ergibt sich dasselbe Ergebnis. - Endnote] [Hinweis: Für zwei verschiedene Werte t1 und t2 ist die Wahrscheinlichkeit, dass h (t1) und h (t2) vergleichen gleich sollte sehr klein sein, nähert sich 1.0 / numeric_- Grenzen :: max (). - Endnote]
Also im Allgemeinen nein, die Berechnung selbst ist nicht definiert und das Ergebnis muss nicht konsistent über Implementierungen sein. In der Tat können sogar zwei verschiedene Versionen derselben Bibliothek zu unterschiedlichen Ergebnissen führen.
Nein, das ist nicht garantiert. std::hash
muss nur die folgenden Bedingungen erfüllen:
- Akzeptiert einen einzelnen Parameter vom Typ Key.
- Gibt einen Wert vom Typ size_t zurück, der den Hash-Wert des Parameters darstellt.
- Beim Aufruf werden keine Ausnahmen ausgelöst.
- Für zwei Parameter k1 und k2, die gleich sind, std :: hash () (k1) == std :: hash () (k2).
- Für zwei verschiedene Parameter k1 und k2, die nicht gleich sind, sollte die Wahrscheinlichkeit std :: hash () (k1) == std :: hash () (k2) sein Seien Sie sehr klein und nähern Sie sich 1.0 / std :: numeric_limits :: max ().
Die Anforderungen ( 17.6.3.4 Hash-Anforderungen [hash.requirements] ) für den von einer Hash
-Funktion zurückgegebenen Wert lauten wie folgt:
Tabelle 26 - Hash-Anforderungen [Hash]
Der zurückgegebene Wert hängt nur vom Argument
k
ab. [Hinweis: Damit sind alle Bewertungen des Ausdrucksh(k)
mit dem Derselbe Wert fürk
ergibt das gleiche Ergebnis. -Ende] [Hinweis: Für zwei verschiedene Wertet1
undt2
, die Wahrscheinlichkeit, dassh(t1)
undh(t2)
vergleichen gleich sollte sehr klein sein und nähert sich1.0 / numeric_limits<size_t>::max()
. -Hinweis]
In der Praxis ist es durchaus üblich, dass für ganzzahlige Typen std::hash(k)
gleich k
ist, da dies die einfachste Implementierung ist, die dem Standard entspricht. Für andere Arten ist alles möglich.