Odtąd używamy N4140 (C ++ 14 Standard).
Zgodnie z § 17.6.3.4 Wymagania mieszania ,
Zwrócona wartość zależy tylko od argumentu
k
dotyczącego czasu trwania programu .[Uwaga: Tak więc wszystkie oceny wyrażenia
h(k)
o tej samej wartościk
dają 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::hash
był 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 md5sum
lub bezpieczniejsze sha256
), są deterministyczne. Czy jest problem z wydajnością?