Ci-après, nous utilisons N4140 (C ++ 14 Standard).
Conformément au § 17.6.3.4 Exigences de hachage ,
La valeur renvoyée ne dépendra que de l'argument
k
de la durée du programme .[Remarque: Ainsi, toutes les évaluations de l'expression
h(k)
avec la même valeur pourk
donnent le même résultat pour une exécution donnée du programme . - note de fin]
et le § 20.9.12 Hachage du modèle de classe dit
...
l'instanciation
hash<Key>
doit:(1.1) - satisfaire aux exigences de hachage (17.6.3.4) ...
(1.2) - ...
Cela signifie qu'une valeur de hachage value
(c.-à-d. hash<decltype(value)>(value)
) Peut prendre une valeur différente si vous redémarrez le programme.
Mais pourquoi? Cette limitation ne se trouvait pas dans la norme C ++ 11, mais dans la norme C ++ 14, C ++ 17 et C ++ 20. En tant qu'utilisateur (pas un développeur STL), il serait très utile s'il std::hash
était déterministe. Y a-t-il des difficultés mathématiques à implémenter une fonction de hachage déterministe? Mais les fonctions de hachage que nous utilisons quotidiennement (par exemple obsolètes md5sum
ou plus sûres sha256
) sont toutes déterministes. Y a-t-il un problème d'efficacité?