Skip to content

Commit ecbec7d

Browse files
committed
✨ [S2] TD05: add warning about modulo and overflow
1 parent 08ca34a commit ecbec7d

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

content/TDs/S2/05_hashAndAssociativeTables.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@ On veux se ramener à un entier compris entre 0 et `max` car cette valeur haché
2727
Le choix de `max` dépend du contexte d'utilisation de la table de hachage, généralement on choisit une valeur qui est une puissance de 2 (par exemple 1024, 2048, 4096, etc.).
2828
:::
2929
30+
:::warning
31+
Dans l'implementation concrète (utilisant une boucle for pour sommer les valeurs ASCII), on préférera appliquer le modulo à chaque itération plutôt qu'à la fin de la boucle. En effet, si la chaîne de caractères est très longue, la somme des valeurs ASCII peut dépasser la taille maximale d'un entier (**overflow**). En appliquant le modulo à chaque itération, on évite ce problème et on s'assure que la valeur hachée reste dans les limites de `size_t`.
32+
33+
Le résultat sera identique car le modulo est [distributif](https://fr.wikipedia.org/wiki/Modulo_(op%C3%A9ration)#:~:text=.-,Distributivit%C3%A9) par rapport à l'addition:
34+
$$
35+
(a+b) \mod m = ((a \mod m) + (b \mod m)) \mod m
36+
$$
37+
38+
Cela va être d'autant plus important pour les questions suivantes où l'on va devoir faire des multiplications supplémentaires et donc des risques d'overflow plus importants.
39+
:::
40+
3041
2. Écrire une nouvelle fonction de hachage sur une chaîne de caractères pour laquelle l'ordre des caractères a de l'importance. Par exemple, les chaînes de caractères "abc" et "cba" ne doivent pas avoir la même valeur hachée. Ce qui est le cas avec la fonction de hachage précédente.
3142
> Utiliser par exemple la somme des codes ASCII des caractères multipliée par leur position dans la chaîne de caractères.
3243
```cpp

0 commit comments

Comments
 (0)