Adloun

Hashtbl.hash ne regarde pas tout

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 12 — Tableaux associatifs, hachage et sérialisation

Énoncé

Combien de valeurs distinctes prend Hashtbl.hash sur les cent mille listes [1;2;3;4;5;6;7;8;9;10;11;12; i] pour de à ? Chercher d'abord la réponse, puis la mesurer.

Corrigé

Mesuré : une seule. Les cent mille listes, toutes distinctes, ont le même haché.

Pourquoi. Hashtbl.hash ne parcourt pas la valeur entière : pour rester en temps constant sur des structures arbitrairement grandes, elle s'arrête après un nombre borné de nœuds significatifs — dix par défaut. Tout ce qui vient au-delà est ignoré.

Mesuré en cherchant le seuil : sur une liste de trente entiers, modifier une des positions à change le haché ; modifier une des positions à ne le change jamais. Le treizième élément de nos listes, celui qui les distingue, tombe donc en dehors de la fenêtre.

Ce n'est pas un défaut du module, c'est un contrat. Une fonction de hachage doit être rapide — sinon elle mange le qu'elle promet. Hacher une liste d'un million d'éléments en la parcourant coûterait par accès, et la table serait plus lente qu'une liste d'association. Le module choisit donc de plafonner, et l'annonce dans sa documentation. La faute serait de l'ignorer.

La conséquence, à connaître : des clés qui ne diffèrent que « profondément » se comportent comme une seule clé. Un tuple dont seules les premières composantes varient, une liste dont on ne change que la fin, un enregistrement dont le champ discriminant est le dernier — tous produisent une table dégénérée.

Les parades.

Ce que cet exercice éprouve : la mise en garde du chapitre — « le est en moyenne, jamais dans le pire cas » — ne parle pas d'un cas rare. Il suffit d'un choix de clés maladroit, sans la moindre intention, pour tomber dessus. L'exercice suivant chiffre ce que cela coûte.

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.