Gli algoritmi cifra di controllo sembrano un lungo elenco di ricette non correlate finché non ci si accorge che sono variazioni di un’unica idea. Ognuno di essi prende i caratteri che precedono la posizione finale, assegna a ciascuno un peso, somma i risultati, divide per un modulo e trasforma ciò che avanza nel carattere conclusivo.
Una volta che questo scheletro è visibile, scegliere tra le famiglie mod-10, mod-11 e mod-97 smette di essere una questione di gusto e diventa una questione di far combaciare quattro parametri con il compito. Questo articolo confronta le famiglie a quel livello e lascia l’aritmetica di ogni singolo schema di carte alle guide che la possiedono.
Quali sono le principali famiglie di algoritmi cifra di controllo?
La divisione consueta avviene per modulo, perché il modulo è il parametro che dà forma a tutto il resto.
La famiglia mod-10 divide la somma ponderata per dieci, quindi il resto è sempre una singola cifra decimale e non richiede ulteriori traduzioni. La famiglia mod-11 divide per undici, il che produce undici resti possibili; dieci di essi stanno in una singola cifra e l’undicesimo deve essere rappresentato in un altro modo. La famiglia mod-97 divide per novantasette, e di solito si sceglie quando gli identificatori sono lunghi o contengono lettere.
ISO 7064 è lo standard internazionale che raccoglie diversi sistemi di caratteri di controllo pubblicati di questo tipo, compresa la disposizione MOD 97-10 usata per gli identificatori di conto che attraversano le frontiere. Dare un nome a una famiglia dice qualcosa sulla forma dell’aritmetica, non sui parametri esatti su cui un particolare schema si è fissato — una distinzione che conta non appena si collocano queste routine dentro una catena di validazione che deve controllare anche set di caratteri e lunghezze.
In che cosa differiscono mod-10, mod-11 e mod-97
Le differenze che contano nella pratica sono tutte conseguenze del modulo.
| Famiglia | Modulo | Uso tipico | La parte scomoda |
|---|---|---|---|
| mod-10 | 10 | Identificatori numerici brevi, numeri di carta e schemi simili | In alcune disposizioni i pesi sono simmetrici, il che indebolisce il rilevamento delle trasposizioni |
| mod-11 | 11 | Identificatori in cui i progettisti volevano un rilevamento degli errori più forte | Un valore del resto non entra in una singola cifra e va mappato o evitato |
| mod-97 | 97 | Identificatori lunghi, specialmente alfanumerici come i numeri di conto transfrontalieri | Richiede di convertire prima le lettere in numeri, quindi la maggior parte delle implementazioni si affida a una libreria anziché a codice scritto a mano |
Uno schema di carte che chiude i suoi numeri con una routine mod-10 di raddoppio e somma appartiene alla prima riga. Quella routine è aritmetica mod-10 che indossa un nome, e qui la visione per famiglie è quella utile: la stessa aritmetica compare in programmi di fidelizzazione, identificatori interni e diversi sistemi nazionali di numerazione, ed è per questo che un aiutante intitolato alle carte tende a sbagliare altrove. La terza riga è quella dietro i lunghi identificatori di conto transfrontalieri, sviluppati passo dopo passo in Struttura IBAN e mod-97.
Ponderazione e modulo: i parametri dentro una famiglia
All’interno di una famiglia i membri differiscono esattamente in tre punti. Il primo è la sequenza dei pesi — quali posizioni vengono moltiplicate per cosa, e se lo schema si ripete o cresce. Il secondo è il modulo stesso, scelto per adattarsi alla lunghezza e all’alfabeto dell’identificatore. Il terzo è la mappatura dal resto al carattere di controllo, ed è qui che vive la maggior parte della varietà visibile.
Vale la pena soffermarsi su quella mappatura, perché è il punto in cui uno schema deve prendere una decisione sui valori avanzati. Un resto mod-10 è una cifra per costruzione. Un resto mod-11 può valere dieci, e lo schema deve o vietare le combinazioni che lo producono, o spostare il risultato in un intervallo diverso, o riservargli un simbolo come la lettera X. Un resto mod-97 deve essere ridotto ulteriormente nei caratteri di controllo che lo schema permette davvero.
Saltare quella decisione è il modo più comune in cui un’implementazione scritta a mano si allontana dalla regola pubblicata. L’aritmetica sembrerà corretta sugli input comodi e fallirà su quelli scomodi.
Perché alcuni algoritmi intercettano gli errori di trasposizione?
I caratteri adiacenti vengono scambiati continuamente quando qualcosa è digitato a mano, quindi intercettare quella classe di errori è un obiettivo di progetto, non un extra.
Il meccanismo sono i pesi. Quando uno schema moltiplica ogni posizione per un valore diverso, scambiare due vicini cambia quanto ciascuno di essi contribuisce, e il totale si sposta di conseguenza. Quando i pesi sono simmetrici — lo stesso valore da entrambi i lati della coppia — i due contributi si scambiano semplicemente di posto e il totale resta invariato, quindi la prova lascia passare lo scambio.
È proprio per questo che esiste il membro della famiglia mod-10 che raddoppia. Raddoppiare le posizioni alternate fa dipendere il peso di ciascuna da dove si trova, il che ripristina la capacità di notare uno scambio. Non è comunque perfetto: certe coppie producono lo stesso totale prima e dopo, e il modo accurato di descrivere qualsiasi cifra di controllo è che intercetta ogni errore su un singolo carattere e la maggior parte, non tutte, le trasposizioni adiacenti.
Quattro domande da porsi prima di scegliere un algoritmo
La scelta è più facile quando la si tratta come un breve insieme di domande concrete anziché come una questione di preferenza.
- Quanto può essere lungo l’identificatore, e la lunghezza è fissa o variabile?
- Quali caratteri sono leciti — solo cifre, o anche lettere?
- Gli errori attesi provengono da persone che digitano, da macchine che generano, o da entrambe?
- Cosa accade quando l’aritmetica produce un carattere di controllo che non entra nel formato?
La quarta domanda è quella che i team saltano. Uno schema che può produrre un resto a due cifre su un campo a una sola cifra ha bisogno di una regola per le eccezioni oppure di un modulo che le eviti, e scoprirlo tardi significa riscrivere la regola anziché ritoccarla.
Ne derivano due abitudini. Non inventare i parametri: implementa ciò che lo schema pubblica, poi verifica l’implementazione contro il materiale pubblicato dallo schema stesso. E quando due schemi in un prodotto condividono gran parte della loro aritmetica, condividi l’implementazione e lascia che differiscano i parametri, anziché copiare la routine e lasciare che le copie si allontanino.
Per gli sviluppatori: un’unica implementazione per un’intera famiglia
La visione per famiglie si ripaga nel codice. Un’unica routine parametrizzata da sequenza dei pesi, modulo e mappatura copre ogni membro, e ogni nuovo schema diventa una configurazione anziché un nuovo file. Questo mantiene breve la revisione, perché l’aritmetica si rivede una volta sola e i parametri si controllano riga per riga.
Due dettagli di progetto prevengono la maggior parte dei problemi. Restituisci il carattere di controllo calcolato anziché un booleano, così un chiamante può stampare ciò che l’aritmetica si aspettava; la differenza tra un valore sbagliato e uno schema non supportato resta allora visibile lungo tutta la catena. E tieni esplicito il passo di rimappatura nella configurazione, perché è la parte che differisce tra gli schemi e quella che nessuno ricorda.
Ogni insieme di cifre usato per illustrare questo articolo è sintetico — i parametri descritti sono conoscenza pubblica, mentre le stringhe di esempio sono costruite per dimostrazione e non descrivono alcun numero che uno schema abbia emesso.
Passi successivi
Elenca i sistemi di numerazione che il tuo prodotto gestisce e colloca ciascuno in una famiglia prima di scrivere qualcos’altro. Poi genera un valore, altera un singolo carattere e altera una coppia di vicini, e conferma che entrambi falliscono; lo strumento di validazione dei numeri mostra i giudizi che un validatore dovrebbe saper distinguere, l’articolo su IBAN e mod-97 è il caso svolto della famiglia per identificatori lunghi, e come funziona la validazione dei numeri torna indietro ai tre livelli in cui questi algoritmi si collocano.