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?