Algoritmo de Luhn - Luhn algorithm

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, sueco números de identificación nacional , sueco números de identidad Corporativa (OrgNr), griego números de Seguro Social (ΑΜΚΑ), Números de tarjeta SIM y códigos de encuesta que aparecen en los recibos de McDonald's , Taco Bell y Tractor Supply Co. Se describe en la Patente de Estados Unidos Nº 2.950.048, 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 . 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

El dígito de control se calcula de la siguiente manera:

  1. Tome el número original y comenzando desde el dígito más a la derecha moviéndose hacia la izquierda, duplique el valor de cada segundo dígito (incluido el dígito más a la derecha).
  2. Reemplace el valor resultante en cada posición con la suma de los dígitos del valor de esta posición.
  3. Sumar los valores resultantes de todas las posiciones ( s ).
  4. El dígito de control calculado es igual a .

Ejemplo para calcular el dígito de control

Suponga un ejemplo de un número de cuenta "7992739871" (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 1 2 1 2 1 2 1 2 1 2
= = = = = = = = = =
7 18 9 4 7 6 9 dieciséis 7 2
Suma de dígitos 7 9 (1 + 8) 9 4 7 6 9 7 (1 + 6) 7 2

La suma de los dígitos resultantes es 67.

El dígito de control es igual a .

Esto hace que el número de cuenta completo sea 79927398713.

Ejemplo para validar el dígito de control

Simplemente corte el dígito de control (último dígito) del número para validar. 79927398713 -> 7992739871 Calcule el dígito de control (ver arriba) (3) y compare su resultado con el dígito de control que cortó (3 = 3). Si coinciden, el número pasó la prueba.

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á 2255 , 3366 o 4477 ).

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.

El algoritmo apareció en una patente estadounidense de un dispositivo mecánico portátil 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 := length(purportedCC)
    int sum := integer(purportedCC[nDigits-1])
    int parity := (nDigits-1) modulus 2
    for i from 0 to nDigits - 2 {
        int digit := integer(purportedCC[i])
        if i modulus 2 = parity
            digit := digit × 2
        if digit > 9
            digit := digit - 9 
        sum := sum + digit
    }
    return (sum modulus 10) = 0
}

Referencias

  1. ^ a b Patente estadounidense 2950048A , Luhn, Hans P. , "Computadora para verificar números", publicada el 23 de agosto de 1960 
  2. ^ "Anexo B: fórmula de Luhn para calcular el módulo-10" doble-suma-doble "dígitos de control". Tarjetas de identificación - Identificación de emisores - Parte 1: Sistema de numeración (Estándar). Organización Internacional de Normalización , Comisión Electrotécnica Internacional . Enero de 2017. ISO / IEC 7812-1 : 2017.

enlaces externos