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?
fuente
Respuestas:
No es necesario que la función hash sea determinista entre ejecuciones, pero aún puede proporcionar su propio hash, por ejemplo, para contenedores desordenados si es un comportamiento en el que confía.
En cuanto a por qué, cppreference dice:
Si los
Hash
requisitos le dicen que sea determinista, entonces no podría proporcionar un hash salado sin romper el requisito.Aquí está la explicación real de por qué
fuente
Esta respuesta (y enlaces en ella) sugerida por @NathanOliver es finalmente útil. Déjame citar partes importantes.
PD
Acabo de buscar en Google "hash table dos" y encontré una página informativa: el momento en que te das cuenta de que todos los servidores del mundo son vulnerables .
fuente