Les algorithmes de chiffre de contrôle ressemblent à une longue liste de recettes sans lien jusqu’à ce que l’on remarque qu’ils sont tous des variations d’une même idée. Chacun prend les caractères qui précèdent la position finale, attribue un poids à chacun d’eux, additionne les résultats, divise par un modulo et transforme ce qui reste en caractère final.
Une fois ce squelette visible, choisir entre les familles mod-10, mod-11 et mod-97 cesse d’être une question de goût pour devenir une question d’adéquation entre quatre paramètres et le travail à accomplir. Cet article compare les familles à ce niveau et laisse l’arithmétique de chaque schéma de carte particulier aux guides qui en sont responsables.
Quelles sont les principales familles d’algorithmes de chiffre de contrôle ?
La division habituelle se fait par modulo, parce que le modulo est le paramètre qui façonne tout le reste.
La famille mod-10 divise la somme pondérée par dix, de sorte que le reste est toujours un seul chiffre décimal et n’a besoin d’aucune conversion supplémentaire. La famille mod-11 divise par onze, ce qui produit onze restes possibles ; dix d’entre eux tiennent sur un seul chiffre et le onzième doit être représenté autrement. La famille mod-97 divise par quatre-vingt-dix-sept, et on y recourt généralement lorsque les identifiants sont longs ou contiennent des lettres.
ISO 7064 est la norme internationale qui rassemble plusieurs systèmes publiés de caractères de contrôle de ce type, y compris la disposition MOD 97-10 utilisée pour les identifiants de compte qui franchissent les frontières. Nommer une famille vous indique la forme de l’arithmétique, pas les paramètres exacts qu’un schéma particulier a retenus — une distinction qui compte dès que l’on place ces routines dans un pipeline de validation qui doit aussi vérifier les jeux de caractères et les longueurs.
En quoi mod-10, mod-11 et mod-97 diffèrent
Les différences qui comptent en pratique sont toutes des conséquences du modulo.
| Famille | Modulo | Usage typique | Le point délicat |
|---|---|---|---|
| mod-10 | 10 | Identifiants numériques courts, numéros de carte et schémas similaires | Ses poids sont symétriques dans certains agencements, ce qui affaiblit la détection des transpositions |
| mod-11 | 11 | Identifiants pour lesquels les concepteurs voulaient une détection d’erreur plus forte | Une valeur de reste ne tient pas sur un seul chiffre et doit être convertie ou évitée |
| mod-97 | 97 | Identifiants longs, en particulier alphanumériques comme les numéros de compte transfrontaliers | Nécessite de convertir d’abord les lettres en nombres, si bien que la plupart des implémentations s’appuient sur une bibliothèque plutôt que sur du code écrit à la main |
Un schéma de carte qui termine ses numéros par une routine mod-10 de doublement et d’addition appartient à la première ligne. Cette routine est de l’arithmétique mod-10 qui porte un nom, et c’est la vue par famille qui est utile ici : la même arithmétique apparaît dans les programmes de fidélité, les identifiants internes et plusieurs systèmes de numérotation nationaux, ce qui explique pourquoi un utilitaire nommé d’après les cartes a tendance à se tromper ailleurs. La troisième ligne est celle qui sous-tend les longs identifiants de compte transfrontaliers, détaillée pas à pas dans Structure IBAN et mod-97.
Pondération et modulo : les paramètres à l’intérieur d’une famille
À l’intérieur d’une même famille, les membres diffèrent exactement à trois endroits. Le premier est la séquence de poids — quelles positions sont multipliées par quoi, et si le motif se répète ou croît. Le deuxième est le modulo lui-même, choisi pour convenir à la longueur et à l’alphabet de l’identifiant. Le troisième est la conversion du reste en caractère de contrôle, et c’est là que réside la majeure partie de la variété visible.
Cette conversion mérite un second regard, car c’est là qu’un schéma doit trancher sur les restes. Un reste mod-10 est un chiffre par construction. Un reste mod-11 peut valoir dix, et le schéma doit soit interdire les combinaisons qui le produisent, soit décaler le résultat dans une autre plage, soit réserver un symbole tel que la lettre X pour le représenter. Un reste mod-97 doit être réduit de nouveau aux caractères de contrôle que le schéma autorise réellement.
Omettre cette décision est la façon la plus courante pour une implémentation écrite à la main de s’écarter de la règle publiée. L’arithmétique semblera correcte sur les entrées confortables et échouera sur les entrées délicates.
Pourquoi certains algorithmes détectent-ils les erreurs de transposition ?
Des caractères adjacents sont constamment permutés lorsqu’une saisie est faite à la main, si bien qu’intercepter cette classe de fautes est un objectif de conception plutôt qu’un bonus.
Le mécanisme réside dans les poids. Lorsqu’un schéma multiplie chaque position par une valeur différente, permuter deux voisins modifie la contribution de chacun et le total s’en trouve déplacé. Lorsque les poids sont symétriques — la même valeur des deux côtés de la paire — les deux contributions échangent simplement leur place et le total reste inchangé, de sorte que le contrôle laisse passer la permutation.
C’est la raison même de l’existence du membre à doublement de la famille mod-10. Doubler les positions alternées fait dépendre le poids de chaque position de son emplacement, ce qui rétablit la capacité à remarquer une permutation. Ce n’est toujours pas parfait : certains appariements produisent le même total avant et après, et la façon exacte de décrire tout chiffre de contrôle est qu’il intercepte toutes les erreurs sur un seul caractère et la plupart, mais pas toutes, des transpositions adjacentes.
Quatre questions à poser avant de choisir un algorithme
La sélection est plus facile lorsqu’on la traite comme un court ensemble de questions concrètes plutôt que comme une affaire de préférence.
- Quelle peut être la longueur de l’identifiant, et cette longueur est-elle fixe ou variable ?
- Quels caractères sont autorisés — uniquement des chiffres, ou aussi des lettres ?
- Les erreurs attendues proviennent-elles de personnes qui saisissent, de machines qui génèrent, ou des deux ?
- Que se passe-t-il lorsque l’arithmétique produit un caractère de contrôle qui ne rentre pas dans le format ?
La quatrième question est celle que les équipes sautent. Un schéma qui peut produire un reste à deux chiffres sur un champ à un seul chiffre a besoin soit d’une règle pour les exceptions, soit d’un modulo qui les évite, et découvrir cela tard signifie réécrire la règle plutôt que l’ajuster.
Deux habitudes en découlent. N’inventez pas de paramètres : implémentez ce que le schéma publie, puis prouvez l’implémentation à partir du matériel publié par ce schéma lui-même. Et lorsque deux schémas d’un même produit partagent la majeure partie de leur arithmétique, partagez l’implémentation et laissez les paramètres différer, plutôt que de copier la routine et de laisser les copies diverger.
Pour les développeurs : une seule implémentation pour toute une famille
La vue par famille se rentabilise dans le code. Une seule routine paramétrée par la séquence de poids, le modulo et la conversion couvre tous les membres, et chaque nouveau schéma devient une configuration plutôt qu’un nouveau fichier. Cela garde la relecture courte, car l’arithmétique est relue une fois et les paramètres sont vérifiés ligne par ligne.
Deux détails de conception évitent la majeure partie des difficultés. Renvoyez le caractère de contrôle calculé plutôt qu’un booléen, afin qu’un appelant puisse afficher ce que l’arithmétique attendait ; la différence entre une valeur erronée et un schéma non pris en charge reste alors visible jusqu’en haut. Et gardez l’étape de reconversion explicite dans la configuration, car c’est la partie qui diffère entre les schémas et celle dont personne ne se souvient.
Chaque ensemble de chiffres utilisé pour illustrer cet article est synthétique — les paramètres décrits relèvent du domaine public, tandis que les chaînes d’exemple sont construites pour la démonstration et ne décrivent aucun numéro qu’un schéma aurait émis.
Étapes suivantes
Listez les schémas de numérotation que votre produit gère et placez chacun dans une famille avant d’écrire quoi que ce soit d’autre. Générez ensuite une valeur, modifiez un seul caractère puis une paire de voisins, et confirmez que les deux échouent ; l’outil de validation de numéros montre les verdicts qu’un validateur doit pouvoir distinguer, l’article IBAN et mod-97 est le cas pratique pour la famille des identifiants longs, et comment fonctionne la validation de numéros revient sur les trois couches dans lesquelles s’inscrivent ces algorithmes.