logo

Luhn algoritm

Luhn-algoritmen, även känd som modul 10 eller mot 10 algoritm, är en enkel kontrollsummaformel som används för att validera en mängd olika identifieringsnummer, såsom kreditkortsnummer, IMEI-nummer, kanadensiska socialförsäkringsnummer. LUHN-formeln skapades i slutet av 1960-talet av en grupp matematiker. Kort därefter antog kreditkortsföretag det. Eftersom algoritmen är allmän egendom kan den användas av vem som helst. De flesta kreditkort och många statliga identifikationsnummer använder algoritmen som en enkel metod för att skilja giltiga nummer från felskrivna eller på annat sätt felaktiga nummer. Det var designat för att skydda mot oavsiktliga fel, inte skadliga attacker.

Steg involverade i Luhn-algoritmen

Låt oss förstå algoritmen med ett exempel:
Tänk på exemplet med ett kontonummer 79927398713 .



Steg 1 – Börja från siffran längst till höger, dubbla värdet för varannan siffra,

Steg 2 – Om dubblering av ett tal resulterar i ett tvåsiffrigt tal, dvs. större än 9 (t.ex. 6 × 2 = 12), lägg till siffrorna för produkten (t.ex. 12: 1 + 2 = 3, 15: 1 + 5 = 6), för att få ett ensiffrigt nummer.



Steg 3 – Ta nu summan av alla siffror.

typer av tester



Steg 4 – Om den totala modulo 10 är lika med 0 (om summan slutar på noll) är talet giltigt enligt Luhns formel; annars är det inte giltigt.

Eftersom summan är 70 vilket är en multipel av 10 är kontonumret möjligen giltigt.

Tanken är enkel; vi korsar från slutet. För varannan siffra dubblar vi den innan vi lägger till den. Vi lägger till två siffror av numret som erhålls efter fördubbling.

Genomförande:

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 handledning för nybörjare

>

>

Python3




livecricket.is

# 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#




// 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


int i sträng



> >// 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'>);> > >

>

>

Produktion

This is a valid card>

Luhn-algoritmen upptäcker alla ensiffriga fel, såväl som nästan alla transponeringar av intilliggande siffror.