Luhnov algoritmus, tiež známy ako modul 10 alebo smerom k 10 algoritmus, je jednoduchý vzorec kontrolného súčtu, ktorý sa používa na overenie rôznych identifikačných čísel, ako sú čísla kreditných kariet, čísla IMEI, kanadské čísla sociálneho poistenia. Vzorec LUHN bol vytvorený koncom 60. rokov minulého storočia skupinou matematikov. Krátko nato ho prijali spoločnosti vydávajúce kreditné karty. Pretože je algoritmus vo verejnej doméne, môže ho použiť ktokoľvek. Väčšina kreditných kariet a mnoho vládnych identifikačných čísel používa tento algoritmus ako jednoduchý spôsob rozlíšenia platných čísel od nesprávne zadaných alebo inak nesprávnych čísel. Bol navrhnutý tak, aby chránil pred náhodnými chybami, nie pred škodlivými útokmi.
Kroky zahrnuté v Luhnovom algoritme
Poďme pochopiť algoritmus na príklade:
Zoberme si príklad čísla účtu 79927398713 .
Krok 1 – Začínajúc od číslice úplne vpravo, zdvojnásobte hodnotu každej druhej číslice,

Krok 2 – Ak zdvojnásobenie čísla vedie k dvojcifernému číslu, t. j. väčšiemu ako 9 (napr. 6 × 2 = 12), potom pridajte číslice súčinu (napr. 12: 1 + 2 = 3, 15: 1 + 5 = 6), aby ste získali jednociferné číslo.

Krok 3 – Teraz zoberte súčet všetkých číslic.
zoznam polí java

Krok 4 – Ak sa celkový modulo 10 rovná 0 (ak sa súčet končí nulou), potom je číslo platné podľa Luhnovho vzorca; inak to nie je platné.

Keďže súčet je 70, čo je násobok 10, číslo účtu je možno platné.
Myšlienka je jednoduchá; traverzujeme od konca. Pre každú druhú číslicu ju pred pridaním zdvojnásobíme. Pridáme dve číslice čísla získaného po zdvojnásobení.
Implementácia:
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.> |
java reťazec poľa
>
>
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#
globálne premenné js
// 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
> >// 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'>);> > > |
vlk verzus líška
>
>Výkon
This is a valid card>
Luhnov algoritmus deteguje akúkoľvek jednocifernú chybu, ako aj takmer všetky transpozície susedných číslic.