Згодом ми використовуємо N4140 (стандарт C ++ 14).
Відповідно до § 17.6.3.4 Вимоги до хешу ,
Повернене значення залежить лише від аргументу
kпротягом тривалості програми .[Примітка. Таким чином, всі оцінки виразу
h(k)з однаковим значеннямkдають однаковий результат для заданого виконання програми . - кінцева примітка]
і § 20.9.12 Хеш-шаблон шаблону класу говорить
...
інстанція
hash<Key>:(1.1) - відповідають вимогам Hash (17.6.3.4) ...
(1.2) - ...
Це означає, що хеш-значення value(тобто hash<decltype(value)>(value)) може приймати інше значення при перезапуску програми.
Але чому? Це обмеження було не в Стандарті C ++ 11, а в Стандарті C ++ 14, C ++ 17 і C ++ 20. Як користувач (а не розробник STL), було б дуже корисно, якби вони std::hashбули детермінованими. Чи є якісь математичні труднощі в реалізації детермінованої хеш-функції? Але хеш-функції, які ми щодня використовуємо (наприклад, застарілі md5sumабо безпечніші sha256), все є детермінованими. Чи є проблема ефективності?