Valida y genera números utilizando el algoritmo de Luhn, comúnmente usado para números de tarjetas de crédito, números de Seguro Social de Canadá y otros números de identificación. Prueba si un número pasa la verificación de Luhn o genera números válidos que cumplen con el algoritmo.
El algoritmo de Luhn, también conocido como el algoritmo de "módulo 10" o "mod 10", es una fórmula de verificación simple utilizada para validar una variedad de números de identificación, como números de tarjetas de crédito, números de Seguro Social en Canadá, números IMEI y números de Identificador de Proveedor Nacional en los Estados Unidos. Esta calculadora te permite validar números utilizando el algoritmo de Luhn y generar números válidos que pasen la verificación de Luhn.
El algoritmo de Luhn funciona de la siguiente manera:
Aquí hay una representación visual del algoritmo de Luhn:
El algoritmo de Luhn se puede expresar matemáticamente de la siguiente manera:
Sea el -ésimo dígito, contando desde el dígito más a la derecha (excluyendo el dígito de verificación) y moviéndose hacia la izquierda. Entonces el dígito de verificación se elige de modo que:
Donde es la operación de módulo.
El algoritmo de Luhn tiene varias aplicaciones en diferentes campos:
Si bien el algoritmo de Luhn es ampliamente utilizado, existen otros algoritmos de verificación para diferentes propósitos:
El algoritmo de Luhn fue creado por Hans Peter Luhn, un científico informático de IBM, en 1954. Luhn fue un pionero en el campo de la ciencia de la información y se le atribuyen varias innovaciones, incluido el sistema de indexación KWIC (Palabra Clave en Contexto).
El algoritmo fue diseñado originalmente para proteger contra errores accidentales, no ataques maliciosos. Es importante tener en cuenta que, aunque el algoritmo de Luhn puede detectar muchos errores comunes, no es una forma segura de cifrado y no debe confiarse en él para fines de seguridad de datos.
A pesar de su antigüedad, el algoritmo de Luhn sigue siendo ampliamente utilizado debido a su simplicidad y efectividad para detectar errores comunes de transcripción.
Aquí hay algunos ejemplos de código para implementar el algoritmo de Luhn en varios lenguajes de programación:
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## Ejemplo de uso:
22print(luhn_validate(4532015112830366)) # True
23print(luhn_validate(4532015112830367)) # False
24print(generate_valid_number(16)) # Genera un número válido de 16 dígitos
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// Ejemplo de uso:
29console.log(luhnValidate(4532015112830366)); // true
30console.log(luhnValidate(4532015112830367)); // false
31console.log(generateValidNumber(16)); // Genera un número válido de 16 dígitos
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álido de 16 dígitos
47 }
48}
49
Al implementar el algoritmo de Luhn, considera los siguientes casos límite y consideraciones especiales:
Validación de Entrada: Asegúrate de que la entrada sea una cadena de números válida. Los caracteres no numéricos deben manejarse adecuadamente (ya sea eliminados o tratados como entrada no válida).
Ceros a la Izquierda: El algoritmo debe funcionar correctamente con números que tengan ceros a la izquierda.
Números Grandes: Prepárate para manejar números muy largos que podrían exceder la capacidad de los tipos de enteros estándar en algunos lenguajes de programación.
Entrada Vacía: Define cómo debe manejar tu implementación las cadenas vacías o las entradas nulas.
Conjuntos de Caracteres No Estándar: En algunas aplicaciones, podrías encontrar números representados con caracteres fuera del rango estándar 0-9. Define cómo deben manejarse.
Consideraciones de Rendimiento: Para aplicaciones que necesitan validar grandes cantidades de entradas rápidamente, considera optimizar la implementación del algoritmo.
Número de Tarjeta de Crédito Válido:
Número de Tarjeta de Crédito Inválido:
Número de Seguro Social Canadiense Válido:
Número IMEI Inválido:
Para verificar la implementación del algoritmo de Luhn, puedes usar los siguientes casos de prueba:
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 # Probar números generados
8 for _ in range(10):
9 assert luhn_validate(generate_valid_number(16)) == True
10
11 print("¡Todas las pruebas pasaron!")
12
13test_luhn_algorithm()
14