Calculadora para Validar Números con el Algoritmo de Luhn

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.

Calculadora del Algoritmo de Luhn

📚

Documentación

Calculadora del Algoritmo de Luhn

Introducción

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.

Cómo Funciona el Algoritmo de Luhn

El algoritmo de Luhn funciona de la siguiente manera:

  1. Comenzando desde el dígito más a la derecha (excluyendo el dígito de verificación) y moviéndose hacia la izquierda, duplica el valor de cada segundo dígito.
  2. Si el resultado de esta operación de duplicación es mayor que 9, resta 9 del resultado.
  3. Suma todos los dígitos en la secuencia resultante.
  4. Si el total módulo 10 es igual a 0 (si el total termina en cero), entonces el número es válido según la fórmula de Luhn; de lo contrario, no es válido.

Aquí hay una representación visual del algoritmo de Luhn:

1. Duplica cada segundo dígito 2. Suma los dígitos (9 para duplicados > 9) 3. Calcula la suma total 4. Verifica si suma % 10 == 0

Fórmula

El algoritmo de Luhn se puede expresar matemáticamente de la siguiente manera:

Sea did_i el ii-é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 d0d_0 se elige de modo que:

(2d2nmod9+d2n1+2d2n2mod9+d2n3++2d2mod9+d1+d0)mod10=0(2d_{2n} \bmod 9 + d_{2n-1} + 2d_{2n-2} \bmod 9 + d_{2n-3} + \cdots + 2d_2 \bmod 9 + d_1 + d_0) \bmod 10 = 0

Donde mod\bmod es la operación de módulo.

Casos de Uso

El algoritmo de Luhn tiene varias aplicaciones en diferentes campos:

  1. Validación de Tarjetas de Crédito: La mayoría de los números de tarjetas de crédito se validan utilizando el algoritmo de Luhn.
  2. Números de Seguro Social en Canadá: El algoritmo de Luhn se utiliza para verificar la validez de estos números de identificación.
  3. Números IMEI: Los números IMEI de teléfonos móviles incorporan un dígito de verificación validado por el algoritmo de Luhn.
  4. Números de Identificador de Proveedor Nacional (NPI): Utilizados en el sistema de salud de los Estados Unidos, estos números se validan utilizando el algoritmo de Luhn.
  5. ISBNs: Algunos números ISBN-10 utilizan una variante del algoritmo de Luhn para la validación.

Alternativas

Si bien el algoritmo de Luhn es ampliamente utilizado, existen otros algoritmos de verificación para diferentes propósitos:

  1. Algoritmo de Damm: Otro algoritmo de dígito de verificación que detecta todos los errores de un solo dígito y todos los errores de transposición adyacente.
  2. Algoritmo de Verhoeff: Un algoritmo de verificación más complejo que captura todos los errores de un solo dígito y la mayoría de los errores de transposición.
  3. Dígito de verificación ISBN-13: Utiliza un algoritmo diferente al de ISBN-10, que se basa en el algoritmo de Luhn.

Historia

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.

Ejemplos de Implementació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

Casos Límite y Consideraciones Especiales

Al implementar el algoritmo de Luhn, considera los siguientes casos límite y consideraciones especiales:

  1. 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).

  2. Ceros a la Izquierda: El algoritmo debe funcionar correctamente con números que tengan ceros a la izquierda.

  3. 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.

  4. Entrada Vacía: Define cómo debe manejar tu implementación las cadenas vacías o las entradas nulas.

  5. 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.

  6. Consideraciones de Rendimiento: Para aplicaciones que necesitan validar grandes cantidades de entradas rápidamente, considera optimizar la implementación del algoritmo.

Ejemplos Numéricos

  1. Número de Tarjeta de Crédito Válido:

    • Número: 4532015112830366
    • Verificación de Luhn: Válido
  2. Número de Tarjeta de Crédito Inválido:

    • Número: 4532015112830367
    • Verificación de Luhn: Inválido
  3. Número de Seguro Social Canadiense Válido:

    • Número: 046 454 286
    • Verificación de Luhn: Válido
  4. Número IMEI Inválido:

    • Número: 490154203237518
    • Verificación de Luhn: Inválido

Casos de Prueba

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

Referencias

  1. Luhn, H. P. (1960). "Computadora para Verificar Números". Patente de EE. UU. 2,950,048.
  2. Gallian, Joseph. "Las Matemáticas de los Números de Identificación." The College Mathematics Journal, vol. 22, no. 3, 1991, pp. 194–202. JSTOR, www.jstor.org/stable/2686878.
  3. "ISO/IEC 7812-1:2017". Organización Internacional de Normalización. Recuperado el 2 de agosto de 2024.
  4. Knuth, Donald. "El Arte de Programar Computadoras, Volumen 2: Algoritmos Seminumerales". Addison-Wesley, 1997.