Im Folgenden verwenden wir N4140 (C ++ 14 Standard).
Gemäß § 17.6.3.4 Hash-Anforderungen ,
Der zurückgegebene Wert hängt nur vom Argument
k
für die Dauer des Programms ab .[Hinweis: Somit ergeben alle Auswertungen des Ausdrucks
h(k)
mit demselben Wert fürk
dasselbe Ergebnis für eine bestimmte Ausführung des Programms . - Endnote]
und § 20.9.12 Klassenvorlagen-Hash sagt
...
Die Instanziierung
hash<Key>
soll:(1.1) - die Hash-Anforderungen erfüllen (17.6.3.4) ...
(1.2) - ...
Dies bedeutet, dass ein Hashwert von value
(dh hash<decltype(value)>(value)
) einen anderen Wert annehmen kann, wenn Sie das Programm neu starten.
Aber warum? Diese Einschränkung war nicht im Standard von C ++ 11 enthalten, sondern im Standard von C ++ 14, C ++ 17 und C ++ 20. Als Benutzer (kein STL-Entwickler) wäre es sehr nützlich, wenn er std::hash
deterministisch wäre. Gibt es mathematische Schwierigkeiten bei der Implementierung einer deterministischen Hash-Funktion? Aber Hash-Funktionen, die wir täglich verwenden (z. B. veraltet md5sum
oder sicherer sha256
), sind alle deterministisch. Gibt es ein Effizienzproblem?
quelle
Antworten:
Es ist nicht erforderlich, dass die Hash-Funktion zwischen den Läufen deterministisch ist, aber Sie können trotzdem Ihren eigenen Hash bereitstellen, z. B. für ungeordnete Container, wenn Sie sich auf dieses Verhalten verlassen.
Was den Grund betrifft, sagt cppreference :
Wenn die
Hash
Anforderungen vorschreiben, dass sie deterministisch sind, können Sie keinen gesalzenen Hash bereitstellen, ohne die Anforderung zu brechen.Hier ist die eigentliche Erklärung warum
quelle
Diese von @NathanOliver vorgeschlagene Antwort (und die darin enthaltenen Links) ist letztendlich hilfreich. Lassen Sie mich wichtige Teile anführen.
PS
Ich habe gerade "Hash Table Dos" gegoogelt und eine informative Seite gefunden: Der Moment, in dem Sie feststellen, dass jeder Server auf der Welt anfällig ist .
quelle