Згодом ми використовуємо 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
), все є детермінованими. Чи є проблема ефективності?