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:
- Sağdan en sağdaki rakamdan (kontrol rakamı hariç) başlayarak, her ikinci rakamın değerini iki katına çıkarın.
- Bu iki katına çıkarma işleminin sonucu 9'dan büyükse, sonuçtan 9 çıkarın.
- Elde edilen dizideki tüm rakamları toplayın.
- 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:
Formül
Luhn algoritması matematiksel olarak şu şekilde ifade edilebilir:
Burada modül işlemini ifade eder.
Kullanım Alanları
Luhn algoritmasının çeşitli alanlarda birçok uygulaması vardır:
- Kredi Kartı Doğrulama: Çoğu kredi kartı numarası Luhn algoritması kullanılarak doğrulanır.
- Kanada Sosyal Sigorta Numaraları: Bu kimlik numaralarının geçerliliğini doğrulamak için Luhn algoritması kullanılır.
- IMEI Numaraları: Mobil telefon IMEI numaraları, Luhn algoritması tarafından doğrulanan bir kontrol rakamı içerir.
- 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.
- 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:
- 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.
- Verhoeff algoritması: Tüm tek haneli hataları ve çoğu transpozisyon hatalarını yakalayan daha karmaşık bir kontrol toplamı algoritmasıdır.
- 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
Kenar Durumları ve Özel Dikkatler
Luhn algoritmasını uygularken, aşağıdaki kenar durumları ve özel dikkatlere dikkat edin:
-
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).
-
Başlangıç Sıfırları: Algoritmanın, başlangıç sıfırlarına sahip sayılarla doğru çalışması gerekir.
-
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.
-
Boş Girdi: Uygulamanızın boş dizeleri veya null girdileri nasıl ele alması gerektiğini tanımlayın.
-
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.
-
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
-
Geçerli Kredi Kartı Numarası:
- Numara: 4532015112830366
- Luhn Kontrolü: Geçerli
-
Geçersiz Kredi Kartı Numarası:
- Numara: 4532015112830367
- Luhn Kontrolü: Geçersiz
-
Geçerli Kanada Sosyal Sigorta Numarası:
- Numara: 046 454 286
- Luhn Kontrolü: Geçerli
-
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
- Luhn, H. P. (1960). "Numaraları Doğrulamak için Bilgisayar". ABD Patenti 2,950,048.
- 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.
- "ISO/IEC 7812-1:2017". Uluslararası Standardizasyon Örgütü. 2 Ağustos 2024'te alındı.
- Knuth, Donald. "Bilgisayar Programlamanın Sanatı, Cilt 2: Sayısal Algoritmalar". Addison-Wesley, 1997.