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
kde la durée du programme .[Remarque: Ainsi, toutes les évaluations de l'expression
h(k)avec la même valeur pourkdonnent 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 md5sumou plus sûres sha256) sont toutes déterministes. Y a-t-il un problème d'efficacité?