Luhn Algoritması — Kart Numarası Doğrulama

Luhn Algoritması ile bir kredi kartı numarasının geçerli olup olmadığını nasıl anlarsınız?

Öncelikle tanımı, adının nereden geldiği ve tarihçesi ile kısa bir giriş yapalım;

Eski bir IBM mühendisi olan Hans Peter Luhn tarafından 1954 yılında geliştirilen bir algoritmadır. Aynı zamanda Mod Check ve Mod 10 algoritması olarak da bilinir. Sadece kart numarası değil, IMEI doğrulamada da kullanılmaktadır.

Kart numaraları ve anlamları için bu yazımızı incelemenizi tavsiye ediyoruz.

Luhn Algoritması Nasıl Çalışır?

Bu görsel boş bir alt niteliğe sahip; dosya adı luhn-1.png

1324 4251 4368 2814 sayı dizisi üzerinden örnekle inceleyelim;

Sayı dizisinin 2. 4. 6. gibi çift sayıya denk gelen hanelerini toplayalım (3+4+2+1+3+8+8+4=33) elde ediyoruz.

Ardından sayı dizisinin 1. 3. 5. gibi tek sayıya denk gelen hanelerini tek tek 2 ile çarpıp topluyoruz. (1*2)+(2*2)+(4*2)+(5*2)+(4*2)+(6*2)+(2*2)+(1*2) = 50 elde ediyoruz.

Şimdi ilk işlemde elde ettiğimiz 33 ile ikinci işlemde elde edilen 50 yi topluyoruz. 33+50 = 83 buluyoruz.

83 rakamının mod 10 a göre kalanı sıfır değildir. Yani 10’ a kalansız bir biçimde bölünmez. Bu nedenle 1324 4251 4368 2814 sayı dizisi geçerli bir kart numarası değildir.

Aşağıdaki örnek kod parçası geliştiriciler için faydalı olabilir;

using System;
using System.Collections.Generic;

internal class Program
{
    private static void Main()
    {
        long girilenKartNumarasi = 371449635398431;

        // 1. Girilen Sayının son hanesini ayrı tut
        string sonHaneOlmayanSayi = girilenKartNumarasi.ToString().Remove(girilenKartNumarasi.ToString().Length - 1);
        long duzenliSayi = long.Parse(sonHaneOlmayanSayi);

        // 2. Tek sırada olan değerleri al
        List<int> tekSiradakiSayilar = new List<int>();
        for (int i = 1; i < duzenliSayi.ToString().Length; i += 2)
        {
            int tekSiradakiSayi = int.Parse(duzenliSayi.ToString().Substring(i, 1)) * 2;
            tekSiradakiSayilar.Add(tekSiradakiSayi);
        }

        // 3. Çift sırada olan değerleri 2 ile çarp
        List<int> ciftSiradakiSayilar = new List<int>();
        for (int i = 0; i < duzenliSayi.ToString().Length; i += 2)
        {
            int ciftSiradakiSayi = int.Parse(duzenliSayi.ToString().Substring(i, 1));
            ciftSiradakiSayilar.Add(ciftSiradakiSayi);
        }

        // 4. Tek sıradaki sayılardan elde edilen değerleri topla
        List<int> tekSayilarinToplami = new List<int>();
        foreach (int tekSayi in tekSiradakiSayilar)
        {
            if (tekSayi < 10)
            {
                tekSayilarinToplami.Add(tekSayi);
            }
            else
            {
                int ilkSayi = Convert.ToInt32(tekSayi.ToString().Substring(0, 1));
                int ikinciSayi = Convert.ToInt32(tekSayi.ToString().Substring(1));

                tekSayilarinToplami.Add(ilkSayi + ikinciSayi);
            }
        }

        // 5. Ayrılan iki ayrı sıradaki sayıları birleştir
        List<int> tumSayilar = new List<int>();
        tumSayilar.AddRange(tekSayilarinToplami);
        tumSayilar.AddRange(ciftSiradakiSayilar);

        // 6. Tüm değerleri topla, sonucu 9 ile çarpıp son haneyi al
        int toplam = 0;
        foreach (int sayi in tumSayilar)
        {
            toplam += sayi;
        }

        int sonuc = toplam * 9;
        sonuc %= 10;

        // 7. Girilen sayının son hanesi ile elde edilen son kontrol sayını karşılaştır
        bool sonHaneDogruMu = girilenKartNumarasi.ToString().EndsWith(sonuc.ToString());
        if (sonHaneDogruMu)
        {
            Console.WriteLine("Kart numarası doğrudur.");
        }
        else
        {
            Console.WriteLine("Kart numarası yanlıştır.");
        }

        Console.Read();
    }
}

Bir Cevap Yazın