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é?
Réponses:
Il n'est pas nécessaire que la fonction de hachage soit déterministe entre les exécutions, mais vous pouvez toujours fournir votre propre hachage, par exemple pour les conteneurs non ordonnés si c'est un comportement sur lequel vous comptez.
Quant à savoir pourquoi, cppreference dit:
Si les
Hash
exigences indiquent qu'il est déterministe, vous ne pourrez pas fournir un hachage salé sans casser l'exigence.Voici l' explication réelle pourquoi
la source
Cette réponse (et les liens qu'elle contient ) suggérée par @NathanOliver est finalement utile. Permettez-moi de citer des parties importantes.
PS
Je viens de googler "table de hachage dos" et trouvé une page informative: Le moment où vous réalisez que chaque serveur dans le monde est vulnérable .
la source