Algoritmo de luhn
El algoritmo de Luhn o fórmula de Luhn, también conocido como "módulo 10" o "mod 10" El algoritmo, que lleva el nombre de su creador, el científico de IBM Hans Peter Luhn, es una fórmula simple de dígito de control que se utiliza para validar una variedad de números de identificación.
Se describe en la patente estadounidense nº 2.950.048, concedida el 23 de agosto de 1960.
El algoritmo es de dominio público y se utiliza ampliamente en la actualidad. Se especifica en ISO/IEC 7812-1. No pretende ser una función hash criptográficamente segura; fue diseñado para proteger contra errores accidentales, no ataques maliciosos. La mayoría de las tarjetas de crédito y muchos números de identificación gubernamentales utilizan el algoritmo como un método simple para distinguir números válidos de números mal escritos o incorrectos.
Descripción
El dígito de control se calcula de la siguiente manera:
- Si el número ya contiene el dígito de verificación, suelte ese dígito para formar el "pago". El dígito de verificación es el último dígito.
- Con la carga útil, comienza desde el dígito más adecuado. Mover a la izquierda, duplicar el valor de cada segundo dígito (incluyendo el dígito más derecho).
- Sum los valores de los dígitos resultantes.
- El dígito de verificación se calcula por , donde s es la suma de paso 3. Este es el número más pequeño (posiblemente cero) que debe ser añadido a para hacer un múltiple de 10. Otras fórmulas válidas que dan el mismo valor son , , y . Note que la fórmula no funcionará en todos los ambientes debido a diferencias en cómo los números negativos son manejados por la operación modulo.
Ejemplo para calcular el dígito de control
Supongamos un ejemplo de un número de cuenta 1789372997 (solo la "carga útil", el dígito de control aún no está incluido):
7 | 9 | 9 | 2 | 7 | 3 | 9 | 8 | 7 | 1 | |
Multiplicadores | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|
= | = | = | = | = | = | = | = | = | = | |
14 | 9 | 18 | 2 | 14 | 3 | 18 | 8 | 14 | 1 | |
dígitos de sumo | 5 (1+4) | 9 | 9 (1+8) | 2 | 5 (1+4) | 3 | 9 (1+8) | 8 | 5 (1+4) | 1 |
La suma de los dígitos resultantes es 56.
El dígito de verificación es igual a .
Esto hace que el número de cuenta completo sea 17893729974.
Ejemplo de validación del dígito de control
- Suelte el dígito de verificación (último dígito) del número para validar. (por ejemplo 17893729974 → 1789372997)
- Calcular el dígito de verificación (ver arriba)
- Compare su resultado con el dígito de verificación original. Si ambos números coinciden, el resultado es válido. (e.g. (givenCheckDigit = calculadoCheckDigit) alter (isValidCheckDigit)).
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 errores gemelos posibles (no detectará 22 ↔ 55, 33 ↔ 66 o 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.
Debido a que el algoritmo opera con los dígitos de derecha a izquierda y los dígitos cero afectan el resultado solo si causan un cambio de posición, rellenar con ceros el comienzo de una cadena de números no afecta el cálculo. Por lo tanto, los sistemas que rellenan con un número específico de dígitos (convirtiendo 1234 en 0001234, por ejemplo) pueden realizar la validación de Luhn antes o después del relleno y lograr el mismo resultado.
El algoritmo apareció en una patente estadounidense para un dispositivo mecánico manual simple para calcular la suma de verificación. El dispositivo tomó la suma mod 10 por medios mecánicos. Los dígitos de sustitución, es decir, los resultados del procedimiento de duplicar y reducir, no se produjeron mecánicamente. Más bien, los dígitos estaban marcados en su orden permutado en el cuerpo de la máquina.
Implementación de pseudocódigo
La siguiente función toma un número de tarjeta, incluido el dígito de control, como una matriz de números enteros y genera verdadero si el dígito de control es correcto, falso en caso contrario.
función isValid(cardNumber[1..length]) suma:= 0 paridad:= longitud mod 2 para i de 1 a longitud do si i mod 2!= paridad entoncessuma:= suma + cardNumber[i] si cardNumber[i] 4 entoncessuma:= suma + 2 * cardNumber[i] - 9 mássuma:= suma + 2 * cardNumber[i] terminar si final for Regreso cardNumber[length] == (10 - (sum mod 10) función final
Implementación del código
C#
bool IsValidLuhn()dentro int[1] dígitos){} int check_digit = 0; para ()int i = dígitos.Duración - 2; i >= 0; --i) check_digit += (()i " 1) es 0) interruptor {} verdadero = dígitos[2] ■ 4 ? dígitos[7] * 2 - 9 : dígitos[3] * 2, falso = dígitos[5] }; Regreso 10 - ()check_digit % 10) == dígitos.Último();}
Java
público estática boolean Es ValidLuhn()String Número) {} int Suma = Cara.getNumericValue()Número.charAt()Número.longitud() - 1)); int total = 0; para ()int i = Número.longitud() - 2; i >= 0; i--) {} int suma = 0; int dígito = Cara.getNumericValue()Número.charAt()i)); si ()i % 2 == 0) {} dígito *= 2; } suma = dígito / 10 + dígito % 10; total += suma; } Regreso 10 - total % 10 == Suma; }
Usos
El algoritmo de Luhn se utiliza en una variedad de sistemas:
- Números de tarjeta de crédito
- Números de IMEI
- Números de identificación de proveedores nacionales en los Estados Unidos
- Números de seguro social canadienses
- Números de identificación israelíes
- Números de identificación de Sudáfrica
- Números de referencia de impuestos de Sudáfrica
- Números de identificación nacionales suecos
- Números de identidad corporativa de Suecia (OrgNr)
- Números griegos de la seguridad social (Asimismo)
- ICCID de tarjetas SIM
- Números de solicitud europea de patentes
- Códigos de encuesta que aparecen en los recibos de McDonald's, Taco Bell y Tractor Supply Co.