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ą?
źródło
Odpowiedzi:
Nie ma potrzeby, aby funkcja skrótu była deterministyczna między uruchomieniami, ale nadal możesz podać swój własny skrót, np. Dla nieuporządkowanych kontenerów, jeśli jest to zachowanie, na którym się opierasz.
Co do tego, dlaczego cppreference mówi:
Jeśli
Hash
wymagania mówią, że jest deterministyczne, to nie byłbyś w stanie zapewnić solonego skrótu bez złamania wymagania.Oto rzeczywiste wyjaśnienie, dlaczego
źródło
Ta odpowiedź (i zawarte w niej linki) sugerowana przez @NathanOliver jest ostatecznie pomocna. Przytoczę ważne części.
PS
Właśnie przejrzałem „tablicę skrótów” i znalazłem stronę informacyjną: Moment, w którym zdasz sobie sprawę, że każdy serwer na świecie jest podatny na atak .
źródło