Здесь и далее мы используем N4140 (стандарт C ++ 14).
Согласно § 17.6.3.4 Ha sh требованиям ,
Возвращаемое значение должно зависеть только от аргумента k
для продолжительности программы .
[Примечание: Таким образом, все вычисления выражения h(k)
с тем же значением для k
дают тот же результат для данного выполнения программы . - конец примечания]
и § 20.9.12 Шаблон класса ha sh говорит
...
the экземпляр hash<Key>
должен:
(1.1) - удовлетворять требованиям Ha sh (17.6.3.4) ...
(1.2) - ...
Это означает, что значение ha sh, равное value
(т.е. hash<decltype(value)>(value)
), может принять другое значение при перезапуске программы.
Но почему? Это ограничение было не в Стандарте C ++ 11, а в Стандарте C ++ 14, C ++ 17 и C ++ 20. Как пользователь (не разработчик STL) было бы весьма полезно, если бы std::hash
были детерминированы c. Есть ли математические трудности в реализации детерминированной функции c га sh? Но ха sh функции, которые мы ежедневно используем (например, устарели md5sum
или безопаснее sha256
), являются определяющими c. Есть ли проблема эффективности?