El Luhn algoritmo o fórmula Luhn , también conocido como el " módulo 10" o "mod 10" algoritmo , llamado así por su creador, IBM científico Hans Peter Luhn , es un simple suma de comprobación fórmula utilizada para validar una variedad de números de identificación, tales como crédito números de tarjetas , números de IMEI , números de identificación de proveedor nacional en Estados Unidos, Canadá números de seguridad social , israelíes números de identificación, Sudáfrica números de identificación, griega números de Seguro Social (ΑΜΚΑ), y los códigos de la encuesta que aparece enRecibos de McDonald's , Taco Bell y Tractor Supply Co. Se describe en la Patente de Estados Unidos Nº 2.950.048 , presentada el 6 de enero de 1954 y concedida el 23 de agosto de 1960.
El algoritmo es de dominio público y se usa ampliamente en la actualidad. Está especificado en ISO / IEC 7812-1 . [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 los números válidos de los números mal escritos o incorrectos.
Descripción
La fórmula verifica un número con su dígito de control incluido , que generalmente se agrega a un número de cuenta parcial para generar el número de cuenta completo. Este número debe pasar la siguiente prueba:
- Desde el dígito más a la derecha (excluyendo el dígito de control) y moviéndose hacia la izquierda, duplique el valor de cada segundo dígito. El dígito de control no se duplica ni se incluye en este cálculo; el primer dígito duplicado es el que se encuentra inmediatamente a la izquierda del dígito de control. Si el resultado de esta operación de duplicación es mayor que 9 (p. Ej., 8 × 2 = 16), sume los dígitos del resultado (p. Ej., 16: 1 + 6 = 7, 18: 1 + 8 = 9) o, de manera equivalente , reste 9 del resultado (por ejemplo, 16: 16 - 9 = 7, 18: 18 - 9 = 9).
- Tome la suma de todos los dígitos (incluido el dígito de control).
- Si el módulo total 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.
Ejemplo para calcular el dígito de control
Suponga un ejemplo de un número de cuenta "7992739871" al que se le agregará un dígito de control, con el formato 7992739871x:
7 | 9 | 9 | 2 | 7 | 3 | 9 | 8 | 7 | 1 | X | |
Doblar cada otro | 7 | 18 | 9 | 4 | 7 | 6 | 9 | dieciséis | 7 | 2 | X |
---|---|---|---|---|---|---|---|---|---|---|---|
Suma de dígitos | 7 | 9 (1 + 8) | 9 | 4 | 7 | 6 | 9 | 7 (1 + 6) | 7 | 2 | X |
La suma de todos los dígitos de la tercera fila, la suma de los dígitos de la suma, es 67.
El dígito de control (x) se obtiene calculando la suma de los dígitos de la suma y luego calculando 9 veces ese valor módulo 10 (en forma de ecuación, ((67 × 9) mod 10)). En forma de algoritmo:
- Calcule la suma de los dígitos de la suma (67).
- Multiplicar por 9 (603).
- 603 mod 10 es entonces 3, que es el dígito de control. Por tanto, x = 3 .
(Método alternativo) El dígito de control (x) se obtiene calculando la suma de los otros dígitos (tercera fila) y luego restando el dígito de las unidades de 10 (67 => dígito de unidades 7; 10 - 7 = dígito de control 3; en forma de ecuación , 10 - (67 mod 10)). En forma de algoritmo:
- Calcule la suma de los dígitos de la suma (67).
- Tome el dígito de las unidades (7).
- Reste el dígito de las unidades de 10.
- El resultado (3) es el dígito de control. En caso de que la suma de dígitos termine en 0, entonces 0 es el dígito de control.
Esto hace que el número de cuenta completo sea 79927398713.
Ejemplo para validar el dígito de control
Cada uno de los números 79927398710, 79927398711, 79927398712, 79927398713, 79927398714, 79927398715, 79927398716, 79927398717, 79927398718, 79927398719 se puede validar de la siguiente manera.
- Doble cada segundo dígito, desde el extremo derecho: (1 × 2) = 2, (8 × 2) = 16, (3 × 2) = 6, (2 × 2) = 4, (9 × 2) = 18
- Sume todos los dígitos individuales (los dígitos entre paréntesis son los productos del Paso 1): x (el dígito de control) + (2) + 7 + (1 + 6) + 9 + (6) + 7 + (4) + 9 + (1 + 8) + 7 = x + 67.
- Si la suma es múltiplo de 10, es posible que el número de cuenta sea válido. Tenga en cuenta que 3 es el único dígito válido que produce una suma (70) que es múltiplo de 10.
- Por lo tanto, estos números de cuenta no son válidos excepto posiblemente el 79927398713 que tiene el dígito de control correcto.
Alternativamente, puede usar el mismo algoritmo de creación de suma de verificación, ignorando la suma de verificación que ya está en su lugar como si aún no se hubiera calculado. Luego calcule la suma de verificación y compare esta suma de verificación calculada con la suma de verificación original incluida con el número de la tarjeta de crédito. Si la suma de comprobación incluida coincide con la suma de comprobación calculada, entonces el número es válido.
Fortalezas y debilidades
El algoritmo de Luhn detectará cualquier error 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 o 44 ↔ 77 ).
Otros algoritmos de dígitos de control más complejos (como el algoritmo de Verhoeff y el algoritmo 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 en los dígitos de derecha a izquierda y los dígitos cero afectan el resultado solo si causan un cambio en la posición, el relleno con ceros al 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 (al convertir 1234 en 0001234, por ejemplo) pueden realizar la validación de Luhn antes o después del relleno y lograr el mismo resultado.
Anteponer un 0 a números impares hace posible procesar el número de izquierda a derecha en lugar de derecha a izquierda, duplicando los dígitos impares.
El algoritmo apareció en una patente de los Estados Unidos [2] para un dispositivo mecánico de mano para calcular la suma de comprobación. Por lo tanto, se requería que fuera bastante simple. El dispositivo tomó la suma del 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 se marcaron en su orden permutado en el cuerpo de la máquina.
Implementación de pseudocódigo
function checkLuhn (string purportedCC) { int nDigits: = longitud (purportedCC) suma int: = entero (purportedCC [nDigits-1]) paridad int: = nDígitos módulo 2 para i de 0 a nDigits - 2 { int dígito: = entero (supuesto CC [i]) si i módulo 2 = paridad dígito: = dígito × 2 si dígito> 9 dígito: = dígito - 9 suma: = suma + dígito } return (suma módulo 10) = 0}
Uso
Además de los números de tarjetas de crédito, este algoritmo también se utiliza para calcular el dígito de control en los números de tarjetas SIM.
Referencias
enlaces externos
- Implementación en 88 idiomas en el proyecto Rosetta Code