A seguir, usamos o N4140 (C ++ 14 Standard).
De acordo com o § 17.6.3.4 Requisitos de hash ,
O valor retornado dependerá apenas do argumento
kdurante a duração do programa .[Nota: Assim, todas as avaliações da expressão
h(k)com o mesmo valor parakproduzem o mesmo resultado para uma determinada execução do programa . - nota final]
e § 20.9.12 o hash do modelo de classe diz
...
a instanciação
hash<Key>deve:(1.1) - satisfazer os requisitos de Hash (17.6.3.4) ...
(1,2) - ...
Isso significa que um valor de hash de value(ou seja hash<decltype(value)>(value)) pode assumir um valor diferente se você reiniciar o programa.
Mas por que? Essa limitação não estava no padrão de C ++ 11, mas no padrão de C ++ 14, C ++ 17 e C ++ 20. Como usuário (não desenvolvedor de STL), seria bastante útil se std::hashfosse determinístico. Existem dificuldades matemáticas na implementação de uma função hash determinística? Mas as funções de hash que usamos diariamente (por exemplo, obsoletas md5sumou mais seguras sha256) são todas determinísticas. Existe um problema de eficiência?