Le pire cas provoqué, chronométré
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 12 — Tableaux associatifs, hachage et sérialisation
Énoncé
En s'appuyant sur l'exercice précédent, construire clés distinctes de même haché, les insérer dans une table, et chronométrer. Comparer à clés ordinaires. Que faut-il en conclure pour un serveur ?
Corrigé
Les clés hostiles sont les listes [1;...;12; i] de l'exercice précédent ; les clés honnêtes sont les listes [i]. Mesuré :
| clés honnêtes | clés hostiles | rapport | |||
|---|---|---|---|---|---|
| hachés distincts | temps | hachés distincts | temps | ||
| s | s | ||||
| s | s | ||||
| s | s | ||||
| s | s |
Lire la colonne de droite. Le temps hostile quadruple quand double : c'est la signature d'un . Et pour cause — toutes les clés forment une seule chaîne, la -ième insertion parcourt les précédentes pour vérifier l'absence, et . La table de hachage est devenue une liste chaînée, avec le surcoût du hachage en prime.
Le rapport n'est pas une constante : il croît linéairement, de à quand passe de à . Un rapport qui croît n'est pas une lenteur, c'est un changement de complexité.
Ce qu'il faut en conclure pour un serveur. C'est une attaque par déni de service, et elle est réelle : un serveur qui range dans une table de hachage des données venues du réseau — paramètres d'une requête, en-têtes, identifiants de session — offre à l'attaquant le choix des clés. Il lui suffit d'envoyer quelques milliers de clés de même haché pour que le serveur passe des secondes de calcul sur une requête qui devait en prendre des microsecondes. Quelques requêtes par seconde suffisent alors à saturer une machine.
Les deux parades.
- La randomisation : tirer au démarrage une graine qui entre dans le calcul de . L'attaquant ne peut plus prévoir les collisions, puisqu'elles changent à chaque lancement du programme. C'est ce que font aujourd'hui la plupart des langages par défaut ; en OCaml,
Hashtbl.create random:true 97l'active — et le programme précise queHashtbly est employé sans randomisation, ce qui est un choix pédagogique, pas une recommandation d'ingénierie. - Ne pas indexer par des données non contrôlées, ou plafonner leur nombre.
Et la leçon de fond. Le tableau de synthèse du chapitre dit « en moyenne ». Ces mesures montrent que « en moyenne » présuppose un tirage : elles décrivent des clés arbitraires, pas des clés choisies. Dès que quelqu'un choisit les entrées, la moyenne n'a plus de sens et seul le pire cas parle — et il vaut par opération. Une complexité en moyenne est une hypothèse sur le monde, pas une propriété du programme.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.