stringtranslate.com

algoritmo de luhn

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.

Descripción

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

  1. Si el número ya contiene el dígito de control, elimine ese dígito para formar la "carga útil". El dígito de control suele ser el último dígito.
  2. Con la carga útil, comience 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).
  3. Suma los valores de los dígitos resultantes.
  4. El dígito de control se calcula mediante , donde s es la suma del paso 3. Este es el número más pequeño (posiblemente cero) que se debe sumar para formar un múltiplo de 10. Otras fórmulas válidas que dan el mismo valor son , y . Tenga en cuenta que la fórmula no funcionará en todos los entornos debido a diferencias en cómo la operación de módulo maneja los números negativos .

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):

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 de validación del dígito de control

  1. Suelte el dígito de control (último dígito) del número a validar. (por ejemplo, 17893729974 → 1789372997)
  2. Calcule el dígito de control (ver arriba)
  3. Compare su resultado con el dígito de control original. Si ambos números coinciden, el resultado es válido. (por ejemplo, (dadoCheckDigit = calculadoCheckDigit) ⇔ (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 del 09 al 90 (o viceversa). Detectará la mayoría de los errores gemelos posibles (no detectará 2255 , 3366 o 4477 ).

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.

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.

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

Implementación de código

C#

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 ();         }

Java

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 ;                  }

Usos

El algoritmo de Luhn se utiliza en una variedad de sistemas, que incluyen:

Referencias

  1. ^ ab Patente estadounidense 2950048A, Luhn, Hans P. , "Computadora para verificar números", publicado el 23 de agosto de 1960 
  2. ^ "Anexo B: Fórmula de Luhn para calcular dígitos de control" doble-suma-doble "del módulo 10". Tarjetas de identificación. Identificación de los 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.
  3. ^ "Publicación 199: Guía de implementación de códigos de barras del paquete de correo inteligente (IMpb) para servicios de confirmación y sistemas de pago electrónico". Servicio Postal de los Estados Unidos . Consultado el 29 de noviembre de 2023 .

enlaces externos