Fórmula de Luhn
La fórmula de Luhn , també coneguda com a Mòdul 10 , és un algorisme senzill que permet generar i verificar la validesa de diversos números d’identificació. Va ser inventat el 1954 per l' informàtic d'IBM Hans Peter Luhn i patentat el 1960. [1] Ara en el domini públic té múltiples aplicacions, per exemple per als números de les targetes de crèdit .
Cada targeta de crèdit té el seu propi número de targeta (per exemple, 0000-1234-5678-9123) on la primera part identifica el circuit internacional ( Visa , American Express , Mastercard ...) mentre que la resta el banc emissor i el client.
Descripció de l'algorisme per al càlcul de la figura de Luhn
El dígit de comprovació del tipus Luhn es calcula d’una manera senzilla. S'afegeixen tots els dígits de la posició igual al doble de la suma dels que es troben en posició senar. Per tant, considerem el mòdul respecte a 10 (és a dir, la resta de la divisió per 10) del valor així obtingut; la figura de Luhn es determina de la següent manera:
- si el mòdul és 0 (la suma és divisible per 10), el dígit de comprovació serà 0. Per exemple, si la suma = 60 dividida per 10 dóna la resta 0, el dígit de Luhn serà 0
- en cas contrari, la figura de Luhn serà la diferència entre 10 i el mòdul. Per exemple, si la suma = 61 que divideix per 10 dóna la resta 1, la xifra de Luhn serà 9 (10-1)
Verificació del número
La comprovació d’un número que conté el dígit de Luhn es basa en tres passos:
- Començant per la dreta i desplaçant-vos cap a l’esquerra, multipliqueu cada dígit col·locat uniformement per 2
- Quan la multiplicació ha donat un resultat de dues xifres, afegiu-ne els dos per obtenir-ne només un (per exemple, 18 = 1 + 8)
- Sumeu tots els dígits, tant en posició parell com en posició senar
Si la suma total és divisible per 10 (la divisió no té resta), la targeta és vàlida.
Per exemple, suposant que teniu el número de targeta següent: 4716-4359-1733-0099 (per tant, 9900367291386278)
- 9 + 9 + 0 + 0 + 3 + 6 + 7 + 2 + 9 + 1 + 3 + 8 + 6 + 2 + 7 + 8 = 80
- 80/10 = 8 = resultat sencer → targeta vàlida
El número d'assegurança social utilitza la fórmula de Luhn al Canadà per identificar els seus clients; no obstant això, amb la següent fórmula no comprova informació addicional, com ara el nombre de dígits i la validesa de la data de caducitat. Al cap i a la fi, la fórmula ha estat dissenyada per detectar errors de mecanografia, no és adequada per detectar falsificacions voluntàries.
Algorisme en C ++
La funció presentada aquí a C ++ no està pensada per ser optimitzada tant com per ser clara. A més de possibles optimitzacions, una funció més completa podria, per exemple, verificar que la cadena passada a l’entrada només conté dígits decimals. Els comentaris i els noms de variables el més autodescriptibles possibles haurien de deixar clar el funcionament de l'algorisme.
/ **
* La següent funció C ++ calcula i retorna el dígit de comprovació segons la fórmula de Luhn.
* Pren com a paràmetre una cadena numèrica decimal, òbviament sense el dígit de comprovació.
* /
int computeLuhnControlDigit ( cadena numèrica )
{
int sum = 0 , currentDigit , toSum , doubledDigit ;
if ( cadena numèrica . length () % 2 ! = 0 )
cadena numèrica = "0" + cadena numèrica ; // afegiu un 0 si el nombre de dígits és senar
for ( int i = 0 ; i < cadena numèrica . length (); i ++ )
{
digitCurrent = atoi ( cadena numèrica . substr ( cadena numèrica . longitud () - i , 1 ). c_str ()); // converteix el caràcter actual a int
si (( i % 2 ) ! = 0 ) // els dígits senars es doblen
{
DoubleDigit = CurrentDigit * 2 ;
si ( doble dígit > = 10 )
add = 1 + ( doble dígit % 10 ); // afegiu els dígits si el número és> 10
en cas contrari
daSumare = doble dígit ;
}
else // els dígits parells s’afegeixen tal com són
daSumare = CurrentDigit ;
suma + = a afegir ; // actualització del resultat parcial
}
if ( suma % 10 == 0 ) // si la suma és divisible per 10, retorna 0
retorn 0 ;
en cas contrari
retorn 10 - ( suma % 10 ); // en cas contrari, torneu 10: el mòdul 10 de la suma
}
Algorisme en VBA per a Excel 2007
Funció LUHN ( cadena numèrica com a cadena ) com a enter
'Aquesta funció calcula i retorna el dígit de comprovació segons la fórmula de Luhn
'rebent a l'entrada una cadena numèrica decimal, sense el número de control.
Dim sum As Integer , digitCurrent As Integer , daSumare As Integer , digitDouble As Integer
suma = 0
Si (( Len ( cadena numèrica ) Mod 2 ) <> 0 ) Aleshores
cadena numèrica = "0" + cadena numèrica
Finalitza If
Per a i = 1 a Len ( cadena numèrica )
digitCurrent = cint (Mid (cadena numèrica, Len (cadena numèrica) + 1 - I, 1))
Si ( i Mod 2 ) <> 0 Aleshores
DoubleDigit = CurrentDigit * 2
Si Doble dígit > = 10 Aleshores
daSommare = 1 + ( dígit duplicat Mod 10 ) 'afegeix els dígits si el número és> 10
Altrament
afegir = doble dígit
Finalitza If
Altrament
add = dígit actual
Finalitza If
suma = suma + a afegir
Pròxim
Si ( suma Mod 10 ) = 0 Llavors
LUHN = 0
Altrament
LUHN = 10 - ( suma Mod 10 )
Finalitza If
Funció final