Valida i genera números utilitzant l'algorisme de Luhn, comunament utilitzat per a números de targetes de crèdit, números d'assegurança social canadencs i altres números d'identificació. Prova si un número supera la comprovació de Luhn o genera números vàlids que compleixin amb l'algorisme.
L'algorisme de Luhn, també conegut com a "mòdul 10" o "mod 10", és una fórmula de suma de control senzilla utilitzada per validar una varietat de números d'identificació, com ara números de targetes de crèdit, números d'assegurança social canadencs, números IMEI i números d'identificador de proveïdor nacional als Estats Units. Aquesta calculadora permet validar números mitjançant l'algorisme de Luhn i generar números vàlids que superen la comprovació de Luhn.
L'algorisme de Luhn funciona de la següent manera:
Aquí teniu una representació visual de l'algorisme de Luhn:
L'algorisme de Luhn es pot expressar matemàticament de la següent manera:
Deixem que sigui el -è dígit, comptant des del dígit més a la dreta (excloent el dígit de control) i movent-se cap a l'esquerra. Llavors el dígit de control es tria de manera que:
On és l'operació mòdul.
L'algorisme de Luhn té diverses aplicacions en diferents camps:
Si bé l'algorisme de Luhn és àmpliament utilitzat, hi ha altres algorismes de suma de control per a diferents propòsits:
L'algorisme de Luhn va ser creat per Hans Peter Luhn, un científic informàtic d'IBM, el 1954. Luhn va ser un pioner en el camp de la ciència de la informació i se li atribueixen diverses innovacions, incloent el sistema d'indexació KWIC (Key Word In Context).
L'algorisme va ser dissenyat originalment per protegir contra errors accidentals, no contra atacs maliciosos. És important notar que, si bé l'algorisme de Luhn pot detectar molts errors comuns, no és una forma segura de xifrat i no s'ha de confiar per a propòsits de seguretat de dades.
Malgrat la seva antiguitat, l'algorisme de Luhn continua sent àmpliament utilitzat a causa de la seva simplicitat i efectivitat en la detecció d'errors comuns de transcripció.
Aquí teniu alguns exemples de codi per implementar l'algorisme de Luhn en diversos llenguatges de programació:
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## Exemple d'ús:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Genera un número vàlid de 16 dígits
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// Exemple d'ús:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Genera un número vàlid de 16 dígits
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 número vàlid de 16 dígits
47 }
48}
49
Al implementar l'algorisme de Luhn, considereu els següents casos límit i consideracions especials:
Validació d'Entrada: Assegureu-vos que l'entrada sigui una cadena de números vàlida. Els caràcters no numèrics haurien de ser gestionats adequadament (ja sigui eliminats o tractats com a entrada no vàlida).
Zeros a l'Inici: L'algorisme hauria de funcionar correctament amb números que tinguin zeros a l'inici.
Números Grans: Esteu preparats per gestionar números molt llargs que podrien excedir la capacitat dels tipus d'enters estàndard en alguns llenguatges de programació.
Entrada Buida: Definiu com hauria de gestionar la vostra implementació cadenes buides o entrades nules.
Conjunts de Caràcters No Estàndard: En algunes aplicacions, podríeu trobar números representats amb caràcters fora del rang estàndard 0-9. Definiu com s'haurien de gestionar.
Consideracions de Rendiment: Per a aplicacions que necessiten validar un gran nombre d'entrades ràpidament, considereu optimitzar la implementació de l'algorisme.
Número de Targeta de Crèdit Vàlid:
Número de Targeta de Crèdit Invàlid:
Número d'Assegurança Social Canadenc Vàlid:
Número IMEI Invàlid:
Per verificar la implementació de l'algorisme de Luhn, podeu utilitzar els següents casos de prova:
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 # Prova de números generats
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("Tots els tests han passat!")
12
13test_luhn_algorithm()
14