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
k
durante la duración del programa .[Nota: por lo tanto, todas las evaluaciones de la expresión
h(k)
con el mismo valor parak
producir 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::hash
fuera 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 md5sum
o más seguras sha256
) son todas deterministas. ¿Hay algún problema de eficiencia?