Luhnův algoritmus, také známý jako modul 10 nebo směrem k 10 algoritmus, je jednoduchý vzorec kontrolního součtu používaný k ověření různých identifikačních čísel, jako jsou čísla kreditních karet, čísla IMEI, kanadská čísla sociálního pojištění. Vzorec LUHN byl vytvořen koncem 60. let minulého století skupinou matematiků. Krátce poté jej přijaly společnosti vydávající kreditní karty. Protože je algoritmus ve veřejné doméně, může jej používat kdokoli. Většina kreditních karet a mnoho vládních identifikačních čísel používá tento algoritmus jako jednoduchou metodu rozlišení platných čísel od chybně zadaných nebo jinak nesprávných čísel. Byl navržen tak, aby chránil před náhodnými chybami, nikoli škodlivými útoky.
Kroky zahrnuté v Luhnově algoritmu
Pojďme pochopit algoritmus na příkladu:
Vezměme si příklad čísla účtu 79927398713 .
Krok 1 – Počínaje číslicí zcela vpravo zdvojnásobte hodnotu každé druhé číslice,
Krok 2 – Pokud zdvojnásobení čísla vede k dvoucifernému číslu, tj. většímu než 9 (např. 6 × 2 = 12), sečtěte číslice součinu (např. 12: 1 + 2 = 3, 15: 1 + 5 = 6), abyste získali jednociferné číslo.
Krok 3 – Nyní vezměte součet všech číslic.
rozhraní vs abstraktní třída
Krok 4 – Pokud je celkový modulo 10 roven 0 (pokud součet končí nulou), pak je číslo platné podle Luhnova vzorce; jinak to neplatí.
Vzhledem k tomu, že součet je 70, což je násobek 10, číslo účtu je možná platné.
Myšlenka je jednoduchá; přecházíme od konce. Každou druhou číslici před přidáním zdvojnásobíme. Přidáme dvě číslice čísla získaného po zdvojnásobení.
Implementace:
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;> }> |
>
>
Jáva
// 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.> |
návrhové vzory java
>
>
Python3
# 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> |
>
>
C#
ipconfig pro ubuntu
// 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.> |
>
>
mysql zobrazit všechny uživatele
Javascript
> > // 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'> );> > > |
>
>Výstup
This is a valid card>
Luhnův algoritmus detekuje jakoukoli jednocifernou chybu, stejně jako téměř všechny transpozice sousedních číslic.