Whiz Tools

Luhn Algoritması Hesaplayıcı

Luhn Algoritması Hesaplayıcı

Giriş

Luhn algoritması, "modulus 10" veya "mod 10" algoritması olarak da bilinir, kredi kartı numaraları, Kanada Sosyal Sigorta Numaraları, IMEI numaraları ve Amerika Birleşik Devletleri'ndeki Ulusal Sağlayıcı Tanımlayıcı numaraları gibi çeşitli kimlik numaralarını doğrulamak için kullanılan basit bir kontrol toplamı formülüdür. Bu hesaplayıcı, Luhn algoritmasını kullanarak numaraları doğrulamanıza ve Luhn kontrolünü geçebilen geçerli numaralar üretmenize olanak tanır.

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

Luhn algoritması şu şekilde çalışır:

  1. Sağdan en sağdaki rakamdan (kontrol rakamı hariç) başlayarak, her ikinci rakamın değerini iki katına çıkarın.
  2. Bu iki katına çıkarma işleminin sonucu 9'dan büyükse, sonuçtan 9 çıkarın.
  3. Elde edilen dizideki tüm rakamları toplayın.
  4. Toplamın 10'a bölümünden kalan 0 ise (toplam sıfırla bitiyorsa), o zaman sayı Luhn formülüne göre geçerlidir; aksi takdirde geçerli değildir.

İşte Luhn algoritmasının görsel temsili:

1. Her ikinci rakamı iki katına çıkarın 2. Rakamları toplayın (9 için iki katına çıkarılan > 9) 3. Toplamı hesaplayın 4. Toplam % 10 == 0 mı kontrol edin

Formül

Luhn algoritması matematiksel olarak şu şekilde ifade edilebilir:

(2d2nmod9+d2n1+2d2n2mod9+d2n3++2d2mod9+d1+d0)mod10=0(2d_{2n} \bmod 9 + d_{2n-1} + 2d_{2n-2} \bmod 9 + d_{2n-3} + \cdots + 2d_2 \bmod 9 + d_1 + d_0) \bmod 10 = 0

Burada mod\bmod modül işlemini ifade eder.

Kullanım Alanları

Luhn algoritmasının çeşitli alanlarda birçok uygulaması vardır:

  1. Kredi Kartı Doğrulama: Çoğu kredi kartı numarası Luhn algoritması kullanılarak doğrulanır.
  2. Kanada Sosyal Sigorta Numaraları: Bu kimlik numaralarının geçerliliğini doğrulamak için Luhn algoritması kullanılır.
  3. IMEI Numaraları: Mobil telefon IMEI numaraları, Luhn algoritması tarafından doğrulanan bir kontrol rakamı içerir.
  4. Ulusal Sağlayıcı Tanımlayıcı (NPI) Numaraları: Amerika Birleşik Devletleri sağlık sisteminde kullanılan bu numaralar, Luhn algoritması ile doğrulanır.
  5. ISBN'ler: Bazı ISBN-10 numaraları, doğrulama için Luhn algoritmasının bir varyantını kullanır.

Alternatifler

Luhn algoritması yaygın olarak kullanılsa da, farklı amaçlar için başka kontrol toplamı algoritmaları da vardır:

  1. Damm algoritması: Tüm tek haneli hataları ve tüm bitişik transpozisyon hatalarını tespit eden başka bir kontrol rakamı algoritmasıdır.
  2. Verhoeff algoritması: Tüm tek haneli hataları ve çoğu transpozisyon hatalarını yakalayan daha karmaşık bir kontrol toplamı algoritmasıdır.
  3. ISBN-13 kontrol rakamı: ISBN-10'dan farklı bir algoritma kullanır, bu da Luhn algoritmasına dayanır.

Tarihçe

Luhn algoritması, 1954 yılında IBM bilgisayar bilimcisi Hans Peter Luhn tarafından oluşturulmuştur. Luhn, bilgi bilimi alanında öncüdür ve KWIC (Anahtar Kelime Bağlamında) dizinleme sisteminin yanı sıra birçok yeniliğin sahibidir.

Algoritma, başlangıçta kazara meydana gelen hatalardan korunmak için tasarlanmıştır, kötü niyetli saldırılara karşı değil. Luhn algoritmasının birçok yaygın hatayı tespit edebilmesine rağmen, güvenli bir şifreleme biçimi olmadığını ve veri güvenliği amaçları için güvenilmemesi gerektiğini belirtmek önemlidir.

Yaşına rağmen, Luhn algoritması basitliği ve yaygın yazım hatalarını yakalamadaki etkinliği nedeniyle yaygın olarak kullanılmaya devam etmektedir.

Uygulama Örnekleri

Luhn algoritmasını çeşitli programlama dillerinde uygulamak için bazı kod örnekleri:

import random

def luhn_validate(number):
    digits = [int(d) for d in str(number)]
    checksum = 0
    for i in range(len(digits) - 1, -1, -1):
        d = digits[i]
        if (len(digits) - i) % 2 == 0:
            d = d * 2
            if d > 9:
                d -= 9
        checksum += d
    return checksum % 10 == 0

def generate_valid_number(length):
    digits = [random.randint(0, 9) for _ in range(length - 1)]
    checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
    check_digit = (10 - (checksum % 10)) % 10
    return int(''.join(map(str, digits + [check_digit])))

## Örnek kullanım:
print(luhn_validate(4532015112830366))  # True
print(luhn_validate(4532015112830367))  # False
print(generate_valid_number(16))  # Geçerli 16 haneli bir numara üretir
function luhnValidate(number) {
    const digits = number.toString().split('').map(Number);
    let checksum = 0;
    for (let i = digits.length - 1; i >= 0; i--) {
        let d = digits[i];
        if ((digits.length - i) % 2 === 0) {
            d *= 2;
            if (d > 9) d -= 9;
        }
        checksum += d;
    }
    return checksum % 10 === 0;
}

function generateValidNumber(length) {
    const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
    const checksum = digits.reduce((sum, digit, index) => {
        if ((length - 1 - index) % 2 === 0) {
            digit *= 2;
            if (digit > 9) digit -= 9;
        }
        return sum + digit;
    }, 0);
    const checkDigit = (10 - (checksum % 10)) % 10;
    return parseInt(digits.join('') + checkDigit);
}

// Örnek kullanım:
console.log(luhnValidate(4532015112830366));  // true
console.log(luhnValidate(4532015112830367));  // false
console.log(generateValidNumber(16));  // Geçerli 16 haneli bir numara üretir
import java.util.Random;

public class LuhnValidator {
    public static boolean luhnValidate(long number) {
        String digits = String.valueOf(number);
        int checksum = 0;
        boolean isEven = true;
        for (int i = digits.length() - 1; i >= 0; i--) {
            int digit = Character.getNumericValue(digits.charAt(i));
            if (isEven) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            }
            checksum += digit;
            isEven = !isEven;
        }
        return checksum % 10 == 0;
    }

    public static long generateValidNumber(int length) {
        Random random = new Random();
        long[] digits = new long[length - 1];
        for (int i = 0; i < length - 1; i++) {
            digits[i] = random.nextInt(10);
        }
        long checksum = 0;
        for (int i = digits.length - 1; i >= 0; i--) {
            long digit = digits[i];
            if ((length - 1 - i) % 2 == 0) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            }
            checksum += digit;
        }
        long checkDigit = (10 - (checksum % 10)) % 10;
        long result = 0;
        for (long digit : digits) {
            result = result * 10 + digit;
        }
        return result * 10 + checkDigit;
    }

    public static void main(String[] args) {
        System.out.println(luhnValidate(4532015112830366L));  // true
        System.out.println(luhnValidate(4532015112830367L));  // false
        System.out.println(generateValidNumber(16));  // Geçerli 16 haneli bir numara üretir
    }
}

Kenar Durumları ve Özel Dikkatler

Luhn algoritmasını uygularken, aşağıdaki kenar durumları ve özel dikkatlere dikkat edin:

  1. Girdi Doğrulama: Girdinin geçerli bir sayı dizisi olduğundan emin olun. Sayı dışındaki karakterler uygun bir şekilde ele alınmalıdır (ya kaldırılmalı ya da geçersiz girdi olarak değerlendirilmelidir).

  2. Başlangıç Sıfırları: Algoritmanın, başlangıç sıfırlarına sahip sayılarla doğru çalışması gerekir.

  3. Büyük Sayılar: Bazı programlama dillerinde standart tam sayı türlerinin kapasitesini aşabilecek çok uzun sayıları işlemek için hazırlıklı olun.

  4. Boş Girdi: Uygulamanızın boş dizeleri veya null girdileri nasıl ele alması gerektiğini tanımlayın.

  5. Standart Olmayan Karakter Setleri: Bazı uygulamalarda, standart 0-9 aralığındaki karakterlerin dışında temsil edilen sayılarla karşılaşabilirsiniz. Bunların nasıl ele alınacağını tanımlayın.

  6. Performans Dikkatleri: Çok sayıda girişi hızlı bir şekilde doğrulaması gereken uygulamalar için algoritma uygulamasını optimize etmeyi düşünün.

Sayısal Örnekler

  1. Geçerli Kredi Kartı Numarası:

    • Numara: 4532015112830366
    • Luhn Kontrolü: Geçerli
  2. Geçersiz Kredi Kartı Numarası:

    • Numara: 4532015112830367
    • Luhn Kontrolü: Geçersiz
  3. Geçerli Kanada Sosyal Sigorta Numarası:

    • Numara: 046 454 286
    • Luhn Kontrolü: Geçerli
  4. Geçersiz IMEI Numarası:

    • Numara: 490154203237518
    • Luhn Kontrolü: Geçersiz

Test Durumları

Luhn algoritmasının uygulanmasını doğrulamak için aşağıdaki test durumlarını kullanabilirsiniz:

def test_luhn_algorithm():
    assert luhn_validate(4532015112830366) == True
    assert luhn_validate(4532015112830367) == False
    assert luhn_validate(79927398713) == True
    assert luhn_validate(79927398714) == False
    
    # Üretilen sayıları test et
    for _ in range(10):
        assert luhn_validate(generate_valid_number(16)) == True
    
    print("Tüm testler başarılı!")

test_luhn_algorithm()

Referanslar

  1. Luhn, H. P. (1960). "Numaraları Doğrulamak için Bilgisayar". ABD Patenti 2,950,048.
  2. Gallian, Joseph. "Kimlik Numaralarının Matematiği." Kolej Matematik Dergisi, cilt 22, no. 3, 1991, s. 194–202. JSTOR, www.jstor.org/stable/2686878.
  3. "ISO/IEC 7812-1:2017". Uluslararası Standardizasyon Örgütü. 2 Ağustos 2024'te alındı.
  4. Knuth, Donald. "Bilgisayar Programlamanın Sanatı, Cilt 2: Sayısal Algoritmalar". Addison-Wesley, 1997.
Feedback