El algoritmo de Luhn o fórmula de Luhn , también conocido como algoritmo " módulo 10" o "mod 10" , llamado así en honor a 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. [1]
El algoritmo es de dominio público y se utiliza ampliamente en la actualidad. Se especifica en ISO/IEC 7812-1 . [2] 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.
El dígito de control se calcula de la siguiente manera:
Supongamos un ejemplo de un número de cuenta 1789372997 (solo la "carga útil", el dígito de control aún no está incluido):
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.
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 del 09 al 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, 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 (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 [1] 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.
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.
la función es válida (número de tarjeta [1..longitud]) suma: = 0 paridad := longitud mod 2 para i de 1 a longitud, ¿ si mod 2! = paridad entonces suma := suma + númerotarjeta[i] elseif cardNumber[i] > 4 entonces suma := suma + 2 * númerotarjeta[i] - 9 demás suma := suma + 2 * númerotarjeta[i] finalizar si finalizar para devolver número de tarjeta [longitud] == (10 - (suma mod 10)) función final
bool IsValidLuhn ( en int [ 1 ] dígitos ) { int dígito_comprobación = 0 ; para ( int i = dígitos . Longitud - 2 ; i >= 0 ; - i ) check_digit += (( i & 1 ) es 0 ) cambiar { verdadero => dígitos [ i ] > 4 ? dígitos [ i ] * 2 - 9 : dígitos [ i ] * 2 , falso => dígitos [ i ] }; return ( 10 - ( check_digit % 10 )) % 10 == dígitos . Último (); }
público estático booleano isValidLuhn ( número de cadena ) { int suma de comprobación = Carácter . getNumericValue ( número . charAt ( número . longitud () - 1 )); entero total = 0 ; for ( int i = número . longitud () - 2 ; i >= 0 ; i - ) { suma entera = 0 ; int dígito = Carácter . getNumericValue ( número . charAt ( i )); if ( i % 2 == número . length () % 2 ) { //de derecha a izquierda cada dígito impar dígito = dígito * 2 ; } suma = dígito / 10 + dígito % 10 ; total += suma ; } retorno total % 10 != 0 ? 10 - total % 10 == suma de verificación : suma de verificación == 0 ; }
El algoritmo de Luhn se utiliza en una variedad de sistemas, que incluyen: