Valida e genera numeri utilizzando l'algoritmo di Luhn, comunemente usato per numeri di carte di credito, numeri di previdenza sociale canadese e altri numeri identificativi. Verifica se un numero supera il controllo di Luhn o genera numeri validi che rispettano l'algoritmo.
L'algoritmo di Luhn, noto anche come algoritmo "modulus 10" o "mod 10", è una semplice formula di checksum utilizzata per convalidare una varietà di numeri identificativi, come numeri di carte di credito, numeri di previdenza sociale canadesi, numeri IMEI e numeri di identificazione del fornitore nazionale negli Stati Uniti. Questo calcolatore ti consente di convalidare numeri utilizzando l'algoritmo di Luhn e generare numeri validi che superano il controllo di Luhn.
L'algoritmo di Luhn funziona come segue:
Ecco una rappresentazione visiva dell'algoritmo di Luhn:
L'algoritmo di Luhn può essere espresso matematicamente come segue:
Sia la -esima cifra, contando dalla cifra più a destra (escludendo la cifra di controllo) e muovendosi verso sinistra. Quindi la cifra di controllo è scelta in modo che:
Dove è l'operazione modulo.
L'algoritmo di Luhn ha varie applicazioni in diversi campi:
Sebbene l'algoritmo di Luhn sia ampiamente utilizzato, ci sono altri algoritmi di checksum per scopi diversi:
L'algoritmo di Luhn è stato creato da Hans Peter Luhn, un informatico dell'IBM, nel 1954. Luhn è stato un pioniere nel campo della scienza dell'informazione ed è accreditato con diverse innovazioni, incluso il sistema di indicizzazione KWIC (Key Word In Context).
L'algoritmo è stato originariamente progettato per proteggere contro errori accidentali, non attacchi malevoli. È importante notare che, sebbene l'algoritmo di Luhn possa rilevare molti errori comuni, non è una forma sicura di crittografia e non dovrebbe essere utilizzato per scopi di sicurezza dei dati.
Nonostante la sua età, l'algoritmo di Luhn rimane ampiamente utilizzato grazie alla sua semplicità ed efficacia nel rilevare errori comuni di trascrizione.
Ecco alcuni esempi di codice per implementare l'algoritmo di Luhn in vari linguaggi di programmazione:
1import random
2
3def luhn_validate(number):
4 digits = [int(d) for d in str(number)]
5 checksum = 0
6 for i in range(len(digits) - 1, -1, -1):
7 d = digits[i]
8 if (len(digits) - i) % 2 == 0:
9 d = d * 2
10 if d > 9:
11 d -= 9
12 checksum += d
13 return checksum % 10 == 0
14
15def generate_valid_number(length):
16 digits = [random.randint(0, 9) for _ in range(length - 1)]
17 checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
18 check_digit = (10 - (checksum % 10)) % 10
19 return int(''.join(map(str, digits + [check_digit])))
20
21## Esempio di utilizzo:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Genera un numero valido di 16 cifre
25
1function luhnValidate(number) {
2 const digits = number.toString().split('').map(Number);
3 let checksum = 0;
4 for (let i = digits.length - 1; i >= 0; i--) {
5 let d = digits[i];
6 if ((digits.length - i) % 2 === 0) {
7 d *= 2;
8 if (d > 9) d -= 9;
9 }
10 checksum += d;
11 }
12 return checksum % 10 === 0;
13}
14
15function generateValidNumber(length) {
16 const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
17 const checksum = digits.reduce((sum, digit, index) => {
18 if ((length - 1 - index) % 2 === 0) {
19 digit *= 2;
20 if (digit > 9) digit -= 9;
21 }
22 return sum + digit;
23 }, 0);
24 const checkDigit = (10 - (checksum % 10)) % 10;
25 return parseInt(digits.join('') + checkDigit);
26}
27
28// Esempio di utilizzo:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Genera un numero valido di 16 cifre
32
1import java.util.Random;
2
3public class LuhnValidator {
4 public static boolean luhnValidate(long number) {
5 String digits = String.valueOf(number);
6 int checksum = 0;
7 boolean isEven = true;
8 for (int i = digits.length() - 1; i >= 0; i--) {
9 int digit = Character.getNumericValue(digits.charAt(i));
10 if (isEven) {
11 digit *= 2;
12 if (digit > 9) digit -= 9;
13 }
14 checksum += digit;
15 isEven = !isEven;
16 }
17 return checksum % 10 == 0;
18 }
19
20 public static long generateValidNumber(int length) {
21 Random random = new Random();
22 long[] digits = new long[length - 1];
23 for (int i = 0; i < length - 1; i++) {
24 digits[i] = random.nextInt(10);
25 }
26 long checksum = 0;
27 for (int i = digits.length - 1; i >= 0; i--) {
28 long digit = digits[i];
29 if ((length - 1 - i) % 2 == 0) {
30 digit *= 2;
31 if (digit > 9) digit -= 9;
32 }
33 checksum += digit;
34 }
35 long checkDigit = (10 - (checksum % 10)) % 10;
36 long result = 0;
37 for (long digit : digits) {
38 result = result * 10 + digit;
39 }
40 return result * 10 + checkDigit;
41 }
42
43 public static void main(String[] args) {
44 System.out.println(luhnValidate(4532015112830366L)); // true
45 System.out.println(luhnValidate(4532015112830367L)); // false
46 System.out.println(generateValidNumber(16)); // Genera un numero valido di 16 cifre
47 }
48}
49
Quando si implementa l'algoritmo di Luhn, considera i seguenti casi limite e considerazioni speciali:
Validazione dell'Input: Assicurati che l'input sia una stringa numerica valida. I caratteri non numerici devono essere gestiti in modo appropriato (o rimossi o trattati come input non valido).
Zeri Iniziali: L'algoritmo dovrebbe funzionare correttamente con numeri che hanno zeri iniziali.
Numeri Grandi: Essere pronti a gestire numeri molto lunghi che potrebbero superare la capacità dei tipi interi standard in alcuni linguaggi di programmazione.
Input Vuoto: Definisci come la tua implementazione dovrebbe gestire stringhe vuote o input nulli.
Insiemi di Caratteri Non Standard: In alcune applicazioni, potresti incontrare numeri rappresentati con caratteri al di fuori dell'intervallo standard 0-9. Definisci come questi dovrebbero essere gestiti.
Considerazioni sulle Prestazioni: Per applicazioni che devono convalidare un gran numero di input rapidamente, considera di ottimizzare l'implementazione dell'algoritmo.
Numero di Carta di Credito Valido:
Numero di Carta di Credito Non Valido:
Numero di Previdenza Sociale Canadese Valido:
Numero IMEI Non Valido:
Per verificare l'implementazione dell'algoritmo di Luhn, puoi utilizzare i seguenti casi di test:
1def test_luhn_algorithm():
2 assert luhn_validate(4532015112830366) == True
3 assert luhn_validate(4532015112830367) == False
4 assert luhn_validate(79927398713) == True
5 assert luhn_validate(79927398714) == False
6
7 # Testa i numeri generati
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Tutti i test sono stati superati!")
12
13test_luhn_algorithm()
14