En adelante, usamos N4140 (C ++ 14 Standard).
De acuerdo con los requisitos de Hash § 17.6.3.4 ,
El valor devuelto dependerá solo del argumento
kdurante la duración del programa .[Nota: por lo tanto, todas las evaluaciones de la expresión
h(k)con el mismo valor parakproducir el mismo resultado para una ejecución dada del programa . - nota final]
y § 20.9.12 El hash de plantilla de clase dice
...
la instanciación
hash<Key>deberá:(1.1) - satisface los requisitos de Hash (17.6.3.4) ...
(1.2) - ...
Esto significa que un valor hash de value(es decir, hash<decltype(value)>(value)) puede tomar un valor diferente si reinicia el programa.
¿Pero por qué? Esta limitación no estaba en el Estándar de C ++ 11, sino en el Estándar de C ++ 14, C ++ 17 y C ++ 20. Como usuario (no desarrollador de STL), sería bastante útil si std::hashfuera determinista. ¿Hay alguna dificultad matemática en la implementación de una función hash determinista? Pero las funciones hash que usamos diariamente (por ejemplo, obsoletas md5sumo más seguras sha256) son todas deterministas. ¿Hay algún problema de eficiencia?