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
k
durante a duração do programa .[Nota: Assim, todas as avaliações da expressão
h(k)
com o mesmo valor parak
produzem 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::hash
fosse 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 md5sum
ou mais seguras sha256
) são todas determinísticas. Existe um problema de eficiência?