L'algoritme de Luhn, també conegut com a mòdul 10 o cap a les 10 algorisme, és una fórmula de suma de verificació senzilla que s'utilitza per validar una varietat de números d'identificació, com ara números de targeta de crèdit, números IMEI, números d'assegurança social canadenc. La fórmula LUHN va ser creada a finals de la dècada de 1960 per un grup de matemàtics. Poc després, les companyies de targetes de crèdit el van adoptar. Com que l'algoritme és de domini públic, pot ser utilitzat per qualsevol persona. La majoria de les targetes de crèdit i molts números d'identificació governamentals utilitzen l'algorisme com a mètode senzill per distingir els números vàlids dels números escrits malament o incorrectes. Va ser dissenyat per protegir contra errors accidentals, no atacs maliciosos.
Passos implicats en l'algorisme de Luhn
Entenem l'algorisme amb un exemple:
Considereu l'exemple d'un número de compte 79927398713 .
Pas 1 - A partir del dígit de l'extrem dret, doble el valor de cada segon dígit,
Pas 2 – Si la duplicació d'un nombre dóna com a resultat un nombre de dos dígits, és a dir, més gran que 9 (p. ex., 6 × 2 = 12), afegiu els dígits del producte (p. ex., 12: 1 + 2 = 3, 15: 1 + 5 = 6), per obtenir un número d'un sol dígit.
Pas 3 – Ara feu la suma de tots els dígits.
munt d'ordenació
Pas 4 – Si el mòdul total 10 és igual a 0 (si el total acaba en zero), aleshores el nombre és vàlid segons la fórmula de Luhn; en cas contrari no és vàlid.
Com que la suma és 70, que és múltiple de 10, el número de compte és possiblement vàlid.
La idea és senzilla; travessem des del final. Per cada segon dígit, el doblem abans d'afegir-lo. Sumem dues xifres del nombre obtingut després de duplicar.
Implementació:
C++
// C++ program to implement Luhn algorithm> #include> using> namespace> std;> // Returns true if given card number is valid> bool> checkLuhn(> const> string& cardNo)> {> > int> nDigits = cardNo.length();> > int> nSum = 0, isSecond => false> ;> > for> (> int> i = nDigits - 1; i>= 0; i--) {> > int> d = cardNo[i] -> '0'> ;> > if> (isSecond ==> true> )> > d = d * 2;> > // We add two digits to handle> > // cases that make two digits after> > // doubling> > nSum += d / 10;> > nSum += d % 10;> > isSecond = !isSecond;> > }> > return> (nSum % 10 == 0);> }> // Driver code> int> main()> {> > string cardNo => '79927398713'> ;> > if> (checkLuhn(cardNo))> > printf> (> 'This is a valid card'> );> > else> > printf> (> 'This is not a valid card'> );> > return> 0;> }> |
>
>
Java
// Java program to implement> // Luhn algorithm> import> java.io.*;> class> GFG {> > // Returns true if given> // card number is valid> static> boolean> checkLuhn(String cardNo)> {> > int> nDigits = cardNo.length();> > int> nSum => 0> ;> > boolean> isSecond => false> ;> > for> (> int> i = nDigits -> 1> ; i>=> 0> ; i--)> > {> > int> d = cardNo.charAt(i) -> '0'> ;> > if> (isSecond ==> true> )> > d = d *> 2> ;> > // We add two digits to handle> > // cases that make two digits> > // after doubling> > nSum += d /> 10> ;> > nSum += d %> 10> ;> > isSecond = !isSecond;> > }> > return> (nSum %> 10> ==> 0> );> }> > // Driver code> > static> public> void> main (String[] args)> > {> > String cardNo => '79927398713'> ;> > if> (checkLuhn(cardNo))> > System.out.println(> 'This is a valid card'> );> > else> > System.out.println(> 'This is not a valid card'> );> > > }> }> // This Code is contributed by vt_m.> |
què és un monitor
>
>
Python 3
# Python3 program to implement> # Luhn algorithm> # Returns true if given card> # number is valid> def> checkLuhn(cardNo):> > > nDigits> => len> (cardNo)> > nSum> => 0> > isSecond> => False> > > for> i> in> range> (nDigits> -> 1> ,> -> 1> ,> -> 1> ):> > d> => ord> (cardNo[i])> -> ord> (> '0'> )> > > if> (isSecond> => => True> ):> > d> => d> *> 2> > > # We add two digits to handle> > # cases that make two digits after> > # doubling> > nSum> +> => d> /> /> 10> > nSum> +> => d> %> 10> > > isSecond> => not> isSecond> > > if> (nSum> %> 10> => => 0> ):> > return> True> > else> :> > return> False> # Driver code> if> __name__> => => '__main__'> :> > > cardNo> => '79927398713'> > > if> (checkLuhn(cardNo)):> > print> (> 'This is a valid card'> )> > else> :> > print> (> 'This is not a valid card'> )> # This code is contributed by rutvik_56> |
>
bucles java
>
C#
// C# program to implement> // Luhn algorithm> using> System;> class> GFG {> > // Returns true if given> // card number is valid> static> bool> checkLuhn(String cardNo)> {> > int> nDigits = cardNo.Length;> > int> nSum = 0;> > bool> isSecond => false> ;> > for> (> int> i = nDigits - 1; i>= 0; i--)>>> > int> d = cardNo[i] -> '0'> ;> > if> (isSecond ==> true> )> > d = d * 2;> > // We add two digits to handle> > // cases that make two digits> > // after doubling> > nSum += d / 10;> > nSum += d % 10;> > isSecond = !isSecond;> > }> > return> (nSum % 10 == 0);> }> > // Driver code> > static> public> void> Main()> > {> > String cardNo => '79927398713'> ;> > if> (checkLuhn(cardNo))> > Console.WriteLine(> 'This is a valid card'> );> > else> > Console.WriteLine(> 'This is not a valid card'> );> > > }> }> // This Code is contributed by vt_m.> |
>
>
Javascript
java sinó si
> > // Javascript program to implement Luhn algorithm> > > // Returns true if given> > // card number is valid> > function> checkLuhn(cardNo)> > {> > let nDigits = cardNo.length;> > let nSum = 0;> > let isSecond => false> ;> > for> (let i = nDigits - 1; i>= 0; i--)> > {> > let d = cardNo[i].charCodeAt() -> '0'> .charCodeAt();> > if> (isSecond ==> true> )> > d = d * 2;> > // We add two digits to handle> > // cases that make two digits> > // after doubling> > nSum += parseInt(d / 10, 10);> > nSum += d % 10;> > isSecond = !isSecond;> > }> > return> (nSum % 10 == 0);> > }> > > let cardNo => '79927398713'> ;> > if> (checkLuhn(cardNo))> > document.write(> 'This is a valid card'> );> > else> > document.write(> 'This is not a valid card'> );> > > |
>
>Sortida
This is a valid card>
L'algoritme de Luhn detecta qualsevol error d'un sol dígit, així com gairebé totes les transposicions de dígits adjacents.