Luhn algoritması - Luhn algorithm

Luhn algoritması veya Luhn formül , aynı zamanda " modülü 10" ya da "mod 10" algoritması yaratıcısı, almıştır, IBM, bilim adamı Hans Peter Luhn , basit bir kontrol toplamı , örneğin kimlik numarası, çeşitli doğrulamak için kullanılan formül kredi kart numaraları , IMEI numaraları , Amerika Birleşik Devletleri'ndeki Ulusal Sağlayıcı Kimlik numaraları , Kanada Sosyal Sigorta Numaraları , İsrail Kimlik Numaraları, Güney Afrika Kimlik Numaraları, İsveç Ulusal kimlik numaraları , İsveç Kurumsal Kimlik Numaraları (OrgNr), Yunan Sosyal Güvenlik Numaraları (ΑΜΚΑ), McDonald's , Taco Bell ve Tractor Supply Co. faturalarında görünen SIM kart numaraları ve anket kodları . 23 Ağustos 1960'ta verilen ABD Patenti No. 2,950,048'de açıklanmıştır.

Algoritma kamu malıdır ve günümüzde yaygın olarak kullanılmaktadır. ISO/IEC 7812 -1'de belirtilmiştir . Kriptografik olarak güvenli bir karma işlevi olması amaçlanmamıştır ; kötü niyetli saldırılara değil, tesadüfi hatalara karşı koruma sağlamak için tasarlanmıştır. Çoğu kredi kartı ve birçok devlet kimlik numarası, algoritmayı, geçerli sayıları yanlış yazılmış veya yanlış numaralardan ayırt etmenin basit bir yöntemi olarak kullanır.

Açıklama

Kontrol basamağı aşağıdaki gibi hesaplanır:

  1. Orijinal sayıyı alın ve en sağdaki basamaktan sola doğru hareket ederek, her ikinci basamağın (en sağdaki basamak dahil) değerini ikiye katlayın.
  2. Her pozisyonda elde edilen değeri, bu pozisyonun değerinin basamaklarının toplamı ile değiştirin.
  3. Tüm konumlardan ( s ) elde edilen değerleri toplayın .
  4. Hesaplanan kontrol basamağı eşittir .

Kontrol basamağı hesaplama örneği

"7992739871" hesap numarasının bir örneğini varsayalım (sadece "yük", kontrol basamağı henüz dahil edilmemiştir):

7 9 9 2 7 3 9 8 7 1
çarpanlar 1 2 1 2 1 2 1 2 1 2
= = = = = = = = = =
7 18 9 4 7 6 9 16 7 2
rakamların toplamı 7 9 (1+8) 9 4 7 6 9 7 (1+6) 7 2

Elde edilen rakamların toplamı 67'dir.

Kontrol basamağı eşittir .

Bu, tam hesap numarasının 79927398713 okumasını sağlar.

Kontrol basamağını doğrulamak için örnek

Doğrulamak için numaranın kontrol basamağını (son basamak) kesmeniz yeterlidir. 79927398713 -> 7992739871 Kontrol basamağını hesaplayın (yukarıya bakın) (3) ve sonucunuzu kestiğiniz kontrol basamağı (3 = 3) ile karşılaştırın. Sayı eşleşirse testi geçti.

Güçlülükler ve zayıflıklar

Luhn algoritması, herhangi bir tek basamaklı hatanın yanı sıra bitişik basamakların neredeyse tüm aktarımlarını algılayacaktır. Bununla birlikte, 09 ila 90 (veya tam tersi) iki basamaklı dizinin transpozisyonunu tespit etmeyecektir . Olası ikiz hataların çoğunu algılar ( 2255 , 3366 veya 4477 algılamaz ).

Diğer, daha karmaşık basamaklı kontrol algoritmaları ( Verhoeff algoritması ve Damm algoritması gibi ) daha fazla transkripsiyon hatasını algılayabilir. Luhn mod N algoritması sayısal olmayan dizeleri destekleyen bir uzantısıdır.

Algoritma, rakamlar üzerinde sağdan sola bir şekilde çalıştığından ve sıfır basamaklar, yalnızca konumda kaymaya neden olduklarında sonucu etkilediğinden, bir sayı dizisinin başlangıcına sıfır doldurma, hesaplamayı etkilemez. Bu nedenle, belirli sayıda basamağa dolgu yapan sistemler (örneğin 1234'ü 0001234'e çevirerek) dolgudan önce veya sonra Luhn doğrulaması yapabilir ve aynı sonucu elde edebilir.

Algoritma, sağlama toplamını hesaplamak için elde tutulan, mekanik bir cihaz için bir Birleşik Devletler Patentinde ortaya çıktı. Bu nedenle, oldukça basit olması gerekiyordu. Cihaz, mod 10 toplamını mekanik yollarla aldı. İkame basamak olan, çift ve azaltmak prosedürü sonuçları, mekanik olarak üretilmemiştir. Bunun yerine, rakamlar makinenin gövdesinde izin verilen sıralarına göre işaretlendi.

Sözde kod uygulaması

function checkLuhn(string purportedCC) {
    int nDigits := length(purportedCC)
    int sum := integer(purportedCC[nDigits-1])
    int parity := (nDigits-1) modulus 2
    for i from 0 to nDigits - 2 {
        int digit := integer(purportedCC[i])
        if i modulus 2 = parity
            digit := digit × 2
        if digit > 9
            digit := digit - 9 
        sum := sum + digit
    }
    return (sum modulus 10) = 0
}

Referanslar

  1. ^ a b ABD patenti 2950048A , Luhn, Hans P. , "Sayıları doğrulamak için bilgisayar", 1960-08-23'te yayınlandı 
  2. ^ "Ek B: Modül-10 "çift-ekleme-çift" kontrol basamaklarını hesaplamak için Luhn formülü". Kimlik kartları - Düzenleyenlerin kimliği - Bölüm 1: Numaralandırma sistemi (Standart). Uluslararası Standardizasyon Örgütü , Uluslararası Elektroteknik Komisyonu . Ocak 2017. ISO/IEC 7812 -1:2017.

Dış bağlantılar