Odtąd używamy N4140 (C ++ 14 Standard).
Zgodnie z § 17.6.3.4 Wymagania mieszania ,
Zwrócona wartość zależy tylko od argumentu
kdotyczącego czasu trwania programu .[Uwaga: Tak więc wszystkie oceny wyrażenia
h(k)o tej samej wartościkdają ten sam wynik dla danego wykonania programu . - uwaga końcowa]
i § 20.9.12 Skrót szablonu klasy mówi
...
instancja
hash<Key>:(1.1) - spełniają wymagania Hash (17.6.3.4) ...
(1.2) - ...
Oznacza to, że wartość skrótu value(tj. hash<decltype(value)>(value)) Może przyjąć inną wartość po ponownym uruchomieniu programu.
Ale dlaczego? Ograniczenie to nie było w standardzie C ++ 11, ale w standardzie C ++ 14, C ++ 17 i C ++ 20. Jako użytkownik (nie programista STL) byłby bardzo użyteczny, gdyby std::hashbył deterministyczny. Czy są jakieś matematyczne trudności we wdrażaniu deterministycznej funkcji skrótu? Ale funkcje skrótu, których używamy na co dzień (np. Przestarzałe md5sumlub bezpieczniejsze sha256), są deterministyczne. Czy jest problem z wydajnością?