Formula lui Luhn

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Formula lui Luhn , cunoscută și sub numele de Modulo 10 , este un algoritm simplu care vă permite să generați și să verificați validitatea diferitelor numere de identificare. A fost inventat în 1954 de către informaticianul IBM Hans Peter Luhn și brevetat în 1960. [1] Acum în domeniul public are mai multe aplicații, de exemplu pentru numerele cardurilor de credit .

Fiecare card de credit are propriul număr de card (de ex. 0000-1234-5678-9123) unde prima parte identifică circuitul internațional ( Visa , American Express , Mastercard ...) în timp ce restul este banca emitentă și clientul.

Descrierea algoritmului pentru calcularea figurii Luhn

Cifra de verificare de tip Luhn este calculată într-un mod simplu. Se adaugă toate cifrele din poziția egală cu dublul sumei celor din poziția impară. Prin urmare, considerăm modulul față de 10 (adică restul împărțirii cu 10) a valorii astfel obținute; cifra Luhn este apoi determinată după cum urmează:

  • dacă modulul este 0 (suma este divizibilă cu 10) cifra de verificare va fi 0. De exemplu, dacă suma = 60 care împărțită la 10 dă restul 0, cifra Luhn va fi 0
  • altfel figura Luhn va fi diferența dintre 10 și modulo. De exemplu, dacă suma = 61 care împărțită la 10 dă restul 1, cifra lui Luhn va fi 9 (10-1)

Verificarea numărului

Verificarea unui număr care conține cifra lui Luhn se bazează pe trei pași:

  1. Începând de la dreapta și deplasându-vă spre stânga, înmulțiți fiecare cifră plasată uniform cu 2
  2. În cazul în care multiplicarea a dat un rezultat din două cifre, adăugați cele două cifre pentru a obține doar una (de ex. 18 = 1 + 8)
  3. Adăugați toate cifrele, atât cele care sunt în poziție pară, cât și cele care sunt în poziție impar

Dacă suma totală este divizibilă cu 10 (diviziunea nu are rest), cardul este valabil.

De exemplu, presupunând că aveți următorul număr de carte: 4716-4359-1733-0099 (deci 9900367291386278)

  1. 9 + 9 + 0 + 0 + 3 + 6 + 7 + 2 + 9 + 1 + 3 + 8 + 6 + 2 + 7 + 8 = 80
  2. 80/10 = 8 = rezultatul întreg → card valid

Formula Luhn este utilizată în Canada de numărul asigurărilor sociale pentru a-și identifica clienții; cu toate acestea, cu următoarea formulă nu verifică informații suplimentare, cum ar fi numărul de cifre și valabilitatea datei de expirare. La urma urmei, formula a fost concepută pentru a detecta erorile de tastare, nu este potrivită pentru detectarea falsificărilor voluntare.

Algoritm în C ++

Funcția prezentată aici în C ++ nu este menită să fie optimizată atât de mult cât să fie clară. În plus față de posibilele optimizări, o funcție mai completă ar putea, de exemplu, să verifice dacă șirul trecut în intrare conține într-adevăr doar cifre zecimale. Comentariile și numele variabilelor cât se poate de autodescriere ar trebui să clarifice modul în care funcționează algoritmul.

 / **
* Următoarea funcție C ++ calculează și returnează cifra de verificare conform formulei lui Luhn.
* Ia ca parametru un șir numeric zecimal, evident fără cifra de verificare.
* /
int computeLuhnControlDigit ( șir numeric șir )
{
    int sumă = 0 , curentDigit , toSum , doubledDigit ;
    
    if ( șir numeric . lungime () % 2 ! = 0 )
	    șir numeric = "0" + șir numeric ; // adăugați un 0 dacă numărul de cifre este impar
    
    for ( int i = 0 ; i < șir numeric . lungime (); i ++ )
    {
        digitCurrent = atoi ( șir numeric . substr ( șir numeric . lungime () - i , 1 ). c_str ()); // convertiți caracterul curent în int
        dacă (( i % 2 ) ! = 0 ) // cifrele impare sunt dublate
        {
            DoubleDigit = CurrentDigit * 2 ;
            dacă ( cifră dublă > = 10 )
                add = 1 + ( cifră dublă % 10 ); // adăugați cifrele dacă numărul este> 10
            altceva
                daSumare = cifra dublată ;
        }
        else // cifrele pare sunt adăugate așa cum sunt
            daSumare = currentDigit ;

        sum + = a fi adăugat ; // actualizarea rezultatului parțial
    }
    if ( suma % 10 == 0 ) // dacă suma este divizibilă cu 10, returnează 0
        retur 0 ;
    altceva
        returnează 10 - ( suma % 10 ); // în caz contrar, returnează 10 - modulul 10 al sumei
}

Algoritm în VBA pentru Excel 2007

 Funcția LUHN ( șir numeric As String ) Ca întreg

    „Această funcție calculează și returnează cifra de verificare conform formulei lui Luhn

    'primind în intrare un șir numeric zecimal, fără numărul de control.

    Dim sum As Integer , digitCurrent As Integer , daSumare As Integer , digitDouble As Integer
    sumă = 0
    Dacă (( Len ( șir numeric ) Mod 2 ) <> 0 ) Atunci
        șir numeric = "0" + șir numeric
    End If
    Pentru i = 1 către Len ( șir numeric )
        digitCurrent = CInt ( Mid ( șir numeric , Len ( șir numeric ) + 1 - i , 1 ))
        Dacă ( i Mod 2 ) <> 0 Atunci                
            DoubleDigit = CurrentDigit * 2
            Dacă cifră dublă > = 10 Apoi
                daSommare = 1 + ( cifră dublată Mod 10 ) 'adaugă cifrele dacă numărul este> 10
            Altfel
                add = cifră dublă
            End If
        Altfel  
            add = currentdigit
        End If
        sumă = sumă + de adăugat  
      Următorul
    Dacă ( suma Mod 10 ) = 0 Atunci   
        LUHN = 0
    Altfel
        LUHN = 10 - ( suma Mod 10 ) 
    End If
Funcția de sfârșit

Notă

Matematica Portalul de matematică : accesați intrările Wikipedia care se ocupă de matematică