L’algoritmo di Luhn è il motivo per cui un numero di carta termina con una cifra che sembra arbitraria. È una somma di controllo — un piccolo riepilogo aritmetico di ogni cifra che la precede — ed è il test automatizzato più comune che un numero di carta deve superare prima che accada qualsiasi altra cosa. Fu ideato presso IBM negli anni Cinquanta da Hans Peter Luhn e in seguito divenne una convenzione per le carte di pagamento attraverso lo standard internazionale che governa la numerazione delle carte.
Questo articolo spiega a cosa serve la cifra di controllo, come ricavarla su carta, perché intercetta la maggior parte degli errori di battitura e perché superarla significhi molto meno di quanto si presume.
Cosa fa l’algoritmo di Luhn
Prendi un numero di carta, metti da parte l’ultima cifra ed esegui le cifre rimanenti attraverso una procedura fissa. Il risultato determina quale deve essere la cifra finale. Un numero è accettato quando la cifra finale è coerente con tutto ciò che la precede.
Nulla in quella procedura coinvolge una banca, un elenco di conti o un segreto. È aritmetica pubblicata nei libri di testo, riprodotta in quasi ogni linguaggio di programmazione e calcolabile in una frazione di millisecondo. Risponde esattamente a una domanda ristretta: questa stringa contiene un evidente errore di trascrizione?
È facile dimenticare questa ristrettezza. Poiché la somma di controllo è il test automatizzato più visibile in un modulo di pagamento, le persone iniziano a credere che dica più di quanto non dica.
Come si calcola una cifra di controllo a mano?
La procedura va da destra a sinistra sulle cifre che restano una volta rimossa la cifra finale.
- Scrivi le cifre e numera le loro posizioni partendo da destra, cominciando da uno.
- Raddoppia ogni cifra in posizione pari.
- Se un valore raddoppiato supera il nove, sottrai nove — come sommare tra loro le due cifre del risultato.
- Somma tutti i valori.
- Calcola quanto ti servirebbe aggiungere per raggiungere il multiplo di dieci successivo. Quella quantità è la cifra di controllo.
Un breve esempio lo rende concreto. Prendi le cinque cifre 1, 2, 3, 4 e 5 come corpo di un numero più lungo e numerali da destra: il 5 sta in posizione uno, il 4 in posizione due, il 3 in posizione tre, il 2 in posizione quattro e l’1 in posizione cinque. Raddoppiare le posizioni pari trasforma il 4 in 8 e il 2 in 4. I valori sono allora 1, 4, 3, 8 e 5, che totalizzano 21. Il multiplo di dieci successivo è 30, quindi la cifra di controllo è 9 e la sequenza finita termina con 9.
Farlo a mano per un numero di carta a lunghezza piena è noioso ma mai ambiguo. Il software lo fa percorrendo la stringa dalla sua fine, ed è anche per questo che un’implementazione che parte dal lato sbagliato rifiuterà numeri perfettamente validi.
Perché il raddoppio intercetta le cifre trasposte?
La regola del raddoppio non è arbitraria. Fa dipendere il peso di ogni cifra dalla sua posizione, così scambiare due cifre vicine cambia in genere il totale.
Questo conta perché i due errori umani più comuni su un campo numerico sono digitare male una singola cifra e trasporre due cifre adiacenti. Una cifra sbagliata sposta la somma di una quantità diversa da zero, quindi la somma di controllo fallisce quasi sempre. Anche uno scambio tra vicini sposta la somma, perché una delle due cifre era raddoppiata e l’altra no.
Quasi, non sempre. Alcuni scambi sono invisibili a questo controllo. Il classico punto cieco è la coppia zero e nove affiancata: raddoppiare nove e ridurre il risultato di nove restituisce nove, quindi quelle due possono scambiarsi di posto senza cambiare il totale. Altre coppie si comportano allo stesso modo. La descrizione accurata del controllo, quindi, è che intercetta ogni errore di singola cifra e la maggior parte, ma non tutte, delle trasposizioni adiacenti.
Cosa non può dirti la cifra di controllo
Non può dire se un numero è reale. Nulla nell’aritmetica fa riferimento a un emittente, quindi qualsiasi prefisso può essere unito a qualsiasi cifra centrale e calcolata una cifra di controllo valida che si adatti.
Non può dire che un conto è aperto, che una carta non è stata annullata o che la persona che digita il numero ha in mano la carta. Ognuna di queste domande richiede una richiesta di autorizzazione all’emittente, che è esattamente l’operazione che un ambiente di test deve evitare.
Non può neppure garantire la data di scadenza, il nome del titolare o il codice di sicurezza. Quei campi stanno accanto alla cifra di controllo con regole proprie, e un numero che soddisfa la somma di controllo può essere abbinato a una data già passata e a un codice che non corrisponde a nulla.
Questa è la descrizione onesta di ciò che restituisce il generatore di questo sito: ogni valore è strutturalmente valido e coerente con questa somma di controllo, e ognuno di essi è un numero che non è mai stato emesso a nessuno.
Dove altro compare la stessa somma di controllo
Le carte di pagamento sono l’utente più noto di questo metodo, non l’unico. Gli schemi di numerazione che necessitano di una protezione economica contro gli errori di battitura ricorrono spesso alla stessa aritmetica pubblica, tra cui diversi numeri di identificazione nazionali, vari sistemi di carte fedeltà e regalo, e svariati identificatori interni.
Questo riutilizzo ha una conseguenza pratica. Una funzione condivisa che tratta una somma di controllo superata come prova di “carta di credito” classificherà erroneamente qualsiasi altra cosa che per caso la soddisfi. Dai alla routine il nome di ciò che fa — una somma di controllo modulo dieci — piuttosto che del dominio in cui l’hai incontrata la prima volta.
Per gli sviluppatori: ordine dei controlli e trappole comuni
L’ordine di validazione conta più di quanto ci si aspetti, e la somma di controllo non è il punto giusto da cui iniziare.
Controlla prima la lunghezza, perché la procedura non ha opinioni su quante cifre le vengono passate; un frammento di cinque cifre può essere coerente con la somma di controllo e comunque inutile. Controlla poi il set di caratteri, così lettere, spazi estranei e separatori vengono rifiutati prima che parta qualsiasi aritmetica. Calcola la somma di controllo dopo, e solo allora prova a riconoscere una rete dal prefisso.
Tre trappole si presentano ancora e ancora:
- Trattare uno zero iniziale come insignificante. I numeri di carta sono stringhe, non interi, e un’analisi numerica può eliminare silenziosamente una cifra, producendo un fallimento della somma di controllo che non ha nulla a che vedere con la digitazione dell’utente.
- Eseguire il passaggio di raddoppio da sinistra. La posizione è definita da destra, quindi la direzione fa parte della specifica e non è un dettaglio implementativo.
- Segnalare una somma di controllo fallita come carta rifiutata. Significa input malformato, e il messaggio mostrato all’utente dovrebbe dirlo.
Per i dati di test, il modello utile è conservare coppie: un numero che passa e lo stesso numero con una cifra alterata in modo che fallisca. Questo dà alla suite un caso positivo e uno negativo separati da esattamente un carattere, il che rende una regressione evidente a colpo d’occhio. La guida al formato copre le regole di lunghezza e prefisso che dovrebbero essere eseguite prima della somma di controllo, e la guida alla validazione assembla l’intera sequenza in ordine.
Verificare una somma di controllo su una stringa reale
Il modo più rapido per costruire intuizione è far passare qualche stringa attraverso il generatore di numeri di carta. Genera un lotto, cambia una cifra a mano e osserva il controllo fallire; genera di nuovo e nota che si muove solo la cifra finale mentre tutto ciò che la precede resta fisso. Il confronto tra reti vale la pena di essere letto subito dopo, perché la stessa aritmetica si comporta diversamente tra schemi a quindici e sedici cifre e la differenza mette in difficoltà le funzioni scritte a mano.
Passi successivi
Scrivi il tuo ordine di validazione prima di scrivere il codice, con la somma di controllo penultima, e conserva una fixture deliberatamente corrotta per ogni numero valido della tua suite. Quando vuoi vedere come lunghezze e prefissi interagiscono con la cifra finale, prosegui con la guida al formato dei numeri di carta.