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í por su creador, el científico de IBM Hans Peter Luhn , es una fórmula de dígito de control simple que se utiliza para validar una variedad de números de identificación. Se describe en la patente estadounidense 2950048A, otorgada el 23 de agosto de 1960. [1]

El algoritmo es de dominio público y su uso está muy extendido en la actualidad. Está especificado en la norma ISO/IEC 7812-1 . [2] No está pensado para ser una función hash criptográficamente segura ; fue diseñado para proteger contra errores accidentales, no contra 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, omítalo 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 con , donde s es la suma del paso 3. Este es el número más pequeño (posiblemente cero) que se debe sumar para obtener 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 las diferencias en cómo se manejan los números negativos mediante la operación de módulo .

Ejemplo para calcular el dígito de control

Supongamos un ejemplo de un número de cuenta 1789372997 (solo la "carga útil", dígito de control aún no 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 para validar dígito de control

  1. Omite el dígito de control (último dígito) del número a validar. (p. ej. 17893729974 → 1789372997)
  2. Calcular 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, (givenCheckDigit = calculateCheckDigit) ⇔ (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 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 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 provocan 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 (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 de los Estados Unidos [1] para un dispositivo mecánico portátil y simple para calcular la suma de comprobación. El dispositivo tomaba la suma módulo 10 por medios mecánicos. Los dígitos de sustitución , es decir, los resultados del procedimiento de duplicación y reducción, no se producían mecánicamente. En cambio, los dígitos se marcaban 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 como resultado verdadero si el dígito de control es correcto, falso en caso contrario.

función isValid(númeroDeTarjeta[1..longitud]) suma := 0 paridad := longitud mod 2 para i de 1 a longitud hacer  si i mod 2 != paridad entonces suma := suma + cardNumber[i] De lo contrario, si cardNumber[i] > 4 , entonces suma := suma + 2 * cardNumber[i] - 9 demás suma := suma + 2 * cardNumber[i] fin si  fin para  devolver cardNumber[longitud] == ((10 - (suma mod 10)) mod 10) fin función

Usos

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

Referencias

  1. ^ ab Patente estadounidense 2950048A, Luhn, Hans Peter , "Computadora para verificar números", publicada el 23 de agosto de 1960, expedida el 23 de agosto de 1960 
  2. ^ "Anexo B: Fórmula de Luhn para calcular dígitos de control de "doble adición-doble" de 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 y Comisión Electrotécnica Internacional . Enero de 2017. ISO/IEC 7812-1 :2017.
  3. ^ Publicación 199: Guía de implementación del código de barras inteligente para paquetes de correo (IMpb) para servicios de confirmación y sistemas de pago electrónico (PDF) (28.ª ed.). Estados Unidos : United States Postal Service . 10 de octubre de 2023. Archivado (PDF) del original el 17 de noviembre de 2023. Consultado el 29 de noviembre de 2023 .
  4. ^ Albanese, Ilenia (10 de agosto de 2022). "A cosa serve la Partita Iva? Ecco cosa sapere" [¿Para qué sirve el número de IVA? Esto es lo que hay que saber]. Partitaiva.it (en italiano). Archivado desde el original el 29 de junio de 2024. Consultado el 29 de junio de 2024 .

Enlaces externos