El algoritmo de Luhn o fórmula de Luhn (creador: el científico de IBM Hans Peter Luhn ), también conocido como algoritmo " módulo 10" o "mod 10" , es una fórmula simple de dígito de control que se utiliza para validar diversos números de identificación. [ a ] El propósito es diseñar un esquema de numeración de tal manera que, cuando una persona introduce un número, un ordenador pueda comprobar rápidamente si hay errores.
El algoritmo es de dominio público y se utiliza ampliamente en la actualidad. Está especificado en la norma ISO/IEC 7812-1 . [ 2 ] No está diseñado para ser una función hash criptográficamente segura ; fue concebido para proteger contra errores accidentales, no contra ataques maliciosos. La mayoría de los números de tarjetas de crédito y muchos números de identificación gubernamentales utilizan el algoritmo como un método sencillo para distinguir los números válidos de los números mal escritos o incorrectos.
Descripción
El dígito de control se calcula de la siguiente manera:
- Elimine el dígito de control del número (si ya está presente). Esto deja la carga útil.
- Comience con los dígitos de la carga útil y duplique cada segundo dígito (un dígito en una posición impar en orden inverso) cuando se numere de izquierda a derecha.
- Procese la carga útil de derecha a izquierda. Si un dígito duplicado excede el 9 , réstele 9 al dígito.
- Suma todos los dígitos resultantes (incluidos los que no se duplicaron).
- El dígito de control se calcula mediante, donde s es la suma del paso 4. Este es el número más pequeño (posiblemente cero) que debe sumarse apara formar un múltiplo de 10.
- Otras fórmulas válidas que dan el mismo valor son:,, y. Tenga en cuenta que la fórmulaNo funcionará en todos los entornos debido a las diferencias en la forma en que la operación módulo maneja los números negativos .
Ejemplo para calcular el dígito de control
Supongamos, por ejemplo, el número de cuenta 1789372997 (solo la "carga útil", sin incluir aún el dígito de control):
La suma de los dígitos resultantes es 56.
El dígito de control es igual a.
Esto hace que el número de cuenta completo sea 17893729974.
Ejemplo para validar el dígito de control
- Elimine el dígito de control (último dígito) del número que desea validar. (p. ej., 17893729974 → 1789372997)
- Calcula el dígito de control (ver arriba).
- Compara tu resultado con el dígito de control original. Si ambos números coinciden, el resultado es válido. (p. ej., (gidículodecontrolobtenido = dígitodecontrolcalculado) ⇔ (dígitodecontrolesválido)).
Fortalezas y debilidades
El algoritmo de Luhn detectará todos los errores de un solo dígito, así como casi todas las transposiciones de dígitos adyacentes. Sin embargo, no detectará la transposición de la secuencia de dos dígitos 09 a 90 (o viceversa). Detectará la mayoría de los posibles errores gemelos (no detectará 22 ↔ 55 , 33 ↔ 66 ni 44 ↔ 77 ).
Otros algoritmos de dígitos de control más complejos (como el algoritmo de Verhoeff y el algoritmo de Damm ) pueden detectar más errores de transcripción. El algoritmo Luhn mod N es una extensión que admite cadenas no numéricas.
Dado que el algoritmo opera sobre los dígitos de derecha a izquierda y los ceros solo afectan el resultado si provocan un cambio de posición, rellenar con ceros el inicio de una cadena de números no afecta el cálculo. Por lo tanto, los sistemas que rellenan hasta un número específico de dígitos (por ejemplo, al convertir 1234 en 0001234) pueden realizar la validación de Luhn antes o después del relleno y obtener el mismo resultado.
El algoritmo apareció en una patente de Estados Unidos [ 1 ] para un dispositivo mecánico sencillo y portátil para calcular la suma de verificación. El dispositivo calculaba la suma módulo 10 por medios mecánicos. Los dígitos de sustitución , es decir, los resultados del procedimiento de duplicación y reducción, no se generaban mecánicamente. En cambio, los dígitos estaban marcados en su orden permutado en el cuerpo de la máquina.
Implementación en pseudocódigo
La siguiente función recibe un número de tarjeta, incluyendo el dígito de control, como una matriz de enteros y devuelve verdadero si el dígito de control es correcto, y falso en caso contrario.
función isValid(cardNumber[1..length]) suma := 0 paridad := longitud módulo 2 para i desde 1 hasta (longitud - 1) hacer si i mod 2 == paridad entonces suma := suma + número de tarjeta[i] elseif cardNumber[i] > 4 entonces suma := suma + 2 * númeroDeTarjeta[i] - 9 demás suma := suma + 2 * númeroDeTarjeta[i] fin si fin para devolver cardNumber[length] == ((10 - (suma mod 10)) mod 10) fin función
Usos
El algoritmo de Luhn se utiliza en una variedad de sistemas, entre ellos:
- Números de tarjetas de crédito
- números IMEI
- Números CUSIP para instrumentos financieros norteamericanos
- Números de identificación nacional de proveedores en los Estados Unidos
- Números de seguro social canadienses
- Números de identificación israelíes
- Números de identificación sudafricanos
- Números de referencia fiscal sudafricanos
- Números de identificación personal suecos
- Números de identificación corporativa suecos (OrgNr)
- Números de seguridad social griegos (ΑΜΚΑ)
- ICCID de las tarjetas SIM
- Números de solicitud de patente europea
- Códigos de encuesta que aparecen en los recibos de McDonald's , Taco Bell y Tractor Supply Co.
- Los números de seguimiento de paquetes del Servicio Postal de los Estados Unidos utilizan un algoritmo Luhn modificado [ 3 ].
- Números de IVA italianos ( Partita Iva ) [ 4 ]
Referencias
- 1 2 Patente estadounidense 2950048A , Luhn, Hans Peter , "Computadora para verificar números", publicada el 23 de agosto de 1960, emitida el 23 de agosto de 1960
- ↑ «Anexo B: Fórmula de Luhn para el cálculo de dígitos de control de módulo 10 "doble suma doble"». Tarjetas de identificación — Identificación de emisores — Parte 1: Sistema de numeración (norma). Organización Internacional de Normalización y Comisión Electrotécnica Internacional . Enero de 2017. ISO/IEC 7812-1 :2017.
- ↑ Publicación 199: Guía de implementación del código de barras inteligente para paquetes postales (IMpb) para servicios de confirmación y sistemas de pago electrónico (PDF) (28.ª ed.). Estados Unidos : Servicio Postal de los Estados Unidos . 10 de octubre de 2023. Archivado (PDF) del original el 17 de noviembre de 2023. Consultado el 29 de noviembre de 2023 .
- ↑ Albanese, Ilenia (10 de agosto de 2022). "A cosa serve la Partita Iva? Ecco cosa sapere" [ ¿ Para qué sirve el número de IVA? Esto es lo que debes saber ] . Partitaiva.it (en italiano). Archivado del original el 29 de junio de 2024. Consultado el 29 de junio de 2024 .
Notas
- ↑ Se describe en la patente estadounidense 2950048A, otorgada el 23 de agosto de 1960. [ 1 ]
Enlaces externos
- Prueba de Luhn para números de tarjetas de crédito en Rosetta Code : Implementación del algoritmo/fórmula de Luhn en 160 lenguajes de programación al 22 de julio de 2024.
- aritmética modular
- Algoritmos de suma de verificación
- Detección y corrección de errores
- Presentaciones de 1954