Luhn alqoritmi

Vikipediya, açıq ensiklopediya
Jump to navigation Jump to search

Luhn alqoritmiABŞ alimi Hans Peter Luhn tərəfindən yaradılmışdır. Alqoritm Kredit kartlarınının, IMEI nömrələrinin doğruluğunu yoxlamaq üçün yaradılmışdır. Kredit kartlarının 16 rəqəmli Buraxıcı identifikasiya nömrəsi (Eng:Issuer identification number) olur və hər bir kartın özünəməxsus xüsusiyyətləri olur. Məsələn Visa kartları 4 rəqəmi ilə, MasterCardlar 51-55 ilə başlamalıdır.

IIN mömrələrinin gerçəkliyini yoxlamaq üçün Lhun alqoritmindən istifadə edirlər.

Bu alqoritm hal-hazırda ən çox online satış mağazalarında istifadə olunur, kredit kartlarının doğruluğunu İnternet üzərindən Banka sorğu göndərməklə də təyin etmək olur amma bu alqoritm (Lhun) daha sürətli işləməyə imkan verir.

Alqoritmin işləmə prinsipi[redaktə | əsas redaktə]

Alqortimin işləmə prinspini nümunə üzərində göstərək.

16 rəqəmli kredit kartı nömrəmiz olsun.

1234 - 5678 - 9012 - 3459

  1. Cüt indeksdə yerləşən ədələri toplayırıq => (2+4+6+8+0+2+4+9=35)
  2. Tək indeksdə yerləşən ədədləri 2-ə vururuq => (2=6=10=14=18=2=6=10)
  3. 2-ə vurduğumuz ədələrin rəqəmlərinin cəmin tapırıq => (2+6+(1+0)+(1+4)+(1+8)+2+6+(1+0)=32
    1. 2-ə vurduğdan sonra alınan nəticə 9 dan böyük olarsa həmin ədəddən 9 çıxaraq rəqəmlərin cəmin almiş olarıq. 14 rəqəmi üçün: 1 + 4 = 5 <=> 14 - 9 = 5
  4. Altda və üstə tapdığımız ədədləri toplayırıq => (35 + 32 = 67)
  5. Ən son tapdığımız ədədin 10-a bölürük => (67 / 10 = 6.7)

Əgər 10-a tam bölünürsə o zaman bu nömrələr keçərlidir (yəni bir kredit kartına aiddir).

Alqorimin işləməsinə şəkil üzərində baxaq.

Lhun Algoritmi

Proqramlaşdırma Dillərində Təsviri[redaktə | əsas redaktə]

Pascal[redaktə | əsas redaktə]

function CheckLuhn(purportedCC: String): Boolean;
var
  i: Integer;
  Sum: Integer;
  Digit: Integer;
begin
  Sum := 0;
  for i := Length( purportedCC ) downto 1 do begin
    Digit := Ord( purportedCC[ i ] ) - Ord( '0' );
if Odd( i ) then
 Inc( Summ, Digit )
else
 Inc( Summ, Digit*2 mod 10 );
  end;
  Result := Summ mod 10 = 0;
end;

Python Proqramlaşdırma dilində[redaktə | əsas redaktə]

def luhn_checksum(card_number):
    def digits_of(n):
        return [int(d) for d in str(n)]
    digits = digits_of(card_number)
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    checksum = 0
    checksum += sum(odd_digits)
    for d in even_digits:
        checksum += sum(digits_of(d*2))
    return checksum % 10

def is_luhn_valid(card_number):
    return luhn_checksum(card_number) == 0

C++ Proqramlaşdırma dilində[redaktə | əsas redaktə]

#include <iostream>
using namespace std;
 
int toInt(const char c)
{
    return c-'0';
}
 
int confirm( const char *id)
{
    bool is_odd_dgt = true;
    int s = 0;
    const char *cp;
 
    for(cp=id; *cp; cp++);
    while(cp > id) {
        --cp;
        int k = toInt(*cp);
        if (is_odd_dgt) {
            s += k;
        }
        else {
            s += (k!=9)? (2*k)%9 : 9;
        }
	is_odd_dgt = !is_odd_dgt;
    }
    return 0 == s%10;
}
 
int main( )
{
    const char * t_cases[] = {
        "49927398716",
        "49927398717",
        "1234567812345678",
        "4532138662787834",
        NULL,
    };
    for ( const char **cp = t_cases; *cp; cp++) {
        cout << *cp << ": " << confirm(*cp) << endl;
    }
    return 0;
}

Java proqramlaşdırma dilində

public static double check(int[] digits) {
       int sum = 0;
      
       for (int i = 0; i < digits.length; i++) {

           // Ədədləri tərs ardıcıllıqla götürürük
           int digit = digits[digits.length - i - 1];

           // cüt yerdə duran rəqəmləri 2-yəə vururuq
           if (i % 2 == 1) {
               digit *= 2;
           }
           // əgər 2-yə vurduqda ədəd 9-dan böyük olarsa onda rəqəmlə cəmi götürülür. Başqa sözlə ədəddən 9 çıxırıq
           sum += digit > 9 ? digit - 9 : digit;
       }
      // ədədin 10-a bölünməsindən alınan qalıq 0 (sıfır) olarsa Luhn alqoritmi ödənir.
       return sum % 10 == 0;
   }


 1 // Package luhn daxil edilən kodun Luhn alqortiminə uyğun olub olmadığını yoxlayır
 2 package luhn
 3 
 4 // Valid: daxil edilən kodun Luhn alqortiminə uyğun olub olmadığını yoxlayır
 5 func Valid(number string) bool {
 6 	var total, currentNumber int
 7 	var shouldDouble bool
 8 
 9 	number = strings.TrimSpace(number)
10 
11 	if len(number) < 2 {
12 		return false
13 	}
14 
15 	for i := len(number) - 1; i >= 0; i-- {
16 		if unicode.IsSpace(rune(number[i])) {
17 			continue
18 		}
19 
20 		if !unicode.IsDigit(rune(number[i])) {
21 			return false
22 		}
23 
24 		currentNumber = int(number[i] - '0')
25 
26 		if shouldDouble {
27 			currentNumber *= 2
28 			if currentNumber > 9 {
29 				currentNumber -= 9
30 			}
31 		}
32 		shouldDouble = !shouldDouble
33 		total += currentNumber
34 	}
35 
36 	return total%10 == 0
37 }


Həmçinin Bax[redaktə | əsas redaktə]