Menü

Kontrol basamağı algoritmaları: mod-10, mod-11 ve mod-97

Kontrol basamağı algoritmaları aynı aileden gelir: ağırlıklı toplam, mod alma ve kalanı eşleme. mod-10, mod-11 ve mod-97 arasındaki farkı ve seçim ölçütlerini anlatıyoruz.

Yayın tarihi

  • kontrol basamağı
  • algoritma
  • mod alma

Kontrol basamağı algoritmaları, bir numaranın son hanesini “ağırlıklı toplam alıp mod ile kalanı bulma” adımlarıyla üreten bir ailedir. Bu yazıda ailenin ortak iskeletini, başlıca üç üyesinin nerede ayrıldığını ve yeni bir sistem kurarken hangi soruların sorulması gerektiğini bulacaksınız.

Tek bir algoritma mı, bir aile mi?

Tek bir algoritma yoktur; aynı iskeleti paylaşan bir aile vardır. İskelet her üyede aynıdır: numaranın kontrol basamağı dışındaki haneleri soldan sağa belirli ağırlıklarla çarpılır, çarpımlar toplanır, toplam bir modüle bölünür ve elde edilen kalandan son hane üretilir.

Üyeler arasındaki fark üç noktada ortaya çıkar: ağırlıklar (hangi hanenin kaçla çarpıldığı), modül (toplamın hangi sayıya bölündüğü) ve eşleme (kalandan son haneye nasıl geçildiği). Bu üç parametre değiştiğinde, aynı iskeletten birbirinden farklı davranan algoritmalar çıkar.

Bu yüzden “kontrol basamağı algoritması” ifadesi tek bir şeyi adlandırmaz. Doğru soru her zaman “hangi ailenin hangi üyesi” sorusudur.

Ailelerin ortak iskeleti nasıl çalışır?

İskeleti dört adımda özetlemek mümkündür. Birinci adım, numaranın kontrol basamağı dışındaki hanelerini belirlemektir. İkinci adım, her haneyi o basamağa karşılık gelen ağırlıkla çarpmaktır. Üçüncü adım, çarpımların toplamını alıp modüle göre kalanı bulmaktır. Dördüncü adım, kalanı bir haneye dönüştürmektir; bu dönüşüm bazen doğrudan kalanın kendisidir, bazen de modülden çıkarılarak elde edilen bir tamamlayıcıdır.

Ağırlıkların seçimi, algoritmanın hangi hataları yakalayacağını belirler. Bütün ağırlıklar aynı olsaydı, toplam yalnızca hanelerin toplamına bakardı ve iki hanenin yeri değiştiğinde toplam değişmezdi. Ağırlıklar birbirinden farklı seçildiğinde, yer değiştiren iki hane toplamı değiştirmeye başlar.

mod-10, mod-11 ve mod-97 arasındaki fark nedir?

Üç üye de aynı iskeleti kullanır; ayrıldıkları yer modülün büyüklüğü ve eşleme biçimidir. Modül büyüdükçe, birbirinden ayırt edilebilen kalan sayısı artar. Ama modül büyüdüğünde kalanın iki haneli olma ihtimali de doğar; bu durumda kalanın tek karakterle nasıl gösterileceği ayrıca tanımlanmak zorundadır.

Üye Tipik kullanım alanı Modülün etkisi Eşlemede karşılaşılan durum
mod-10 ailesi Kısa ve orta uzunlukta, yalnızca rakam içeren numaralar Küçük modül, basit hesap Kalan tek haneye doğrudan oturur
mod-11 ailesi Ağırlıkların daha çeşitli olduğu numaralar Daha çok kalan ayrılır Kalan iki haneye çıkabilir, eşleme kuralı gerekir
mod-97 Uzun ve harf de içeren numaralar Büyük modül, güçlü ayrım Harflerin önce sayıya çevrilmesi gerekir

Üçüncü üye, uzun numaralarda tercih edilir çünkü uzun bir dizede tek hane farkı toplamı görece az etkiler; büyük bir modül bu küçük farkı görünür kılar. Karşılığında, harf içeren numaralarda harflerin sayıya nasıl çevrileceği ayrıca tanımlanmalıdır.

Komşu iki hane yer değiştirirse sonuç değişir mi?

Ağırlıklar simetrikse değişmez; asimetrikse değişir. Bu, aileler arasındaki en pratik ayrımdır.

Simetrik ağırlık düzeninde haneler sırayla aynı çarpanları tekrar eder. İki komşu hanenin yeri değiştiğinde her biri diğerinin çarpanını alır ve toplam aynı kalır. Böyle bir düzen, en sık yapılan yazım hatalarından birini tamamen kaçırır.

Asimetrik ağırlık düzeninde ise komşu iki hane farklı çarpanlara sahiptir. Yer değiştirme toplamı değiştirir ve kontrol basamağı tutmaz. Yeni bir düzen tasarlarken sorulacak soru bu yüzden şudur: ağırlık dizisi komşu haneler için farklı değerler veriyor mu?

Kontrol basamağının neyi yakalayıp neyi yakalamadığı ise ayrı bir konudur; ailenin ortak sınırları için numara doğrulama yazısındaki katman ayrımına bakabilirsiniz.

Uzun numaralarda neden büyük modül gerekir?

Uzun bir numarada tek bir hane hatası, toplam içinde küçük bir sapma yaratır. Modül küçükse bu sapma, başka bir hatanın yarattığı sapmayla aynı kalana düşebilir ve hata gizlenir. Modül büyüdükçe aynı sapma farklı bir kalana karşılık gelir; hata görünür hâle gelir.

Bunun bedeli, eşlemenin karmaşıklaşmasıdır. Modül büyük olduğunda kalan iki haneli olabilir ve kontrol basamağı tek bir karakter olarak gösterilmek zorundadır. Bu yüzden bazı düzenler, belirli bir kalan değerini bir harfle göstermeyi tanımlar. Bir düzeni uygularken bu eşlemenin açıkça yazılmış olması gerekir; çünkü eşleme tanımlı değilse aynı kalan iki farklı sistemde iki farklı karaktere karşılık gelir.

Büyük modülün ikinci bedeli, hesabın harf içeren numaralara uygulanmasıdır. Harfler önce sayıya çevrilmeden toplama giremez; bu çevrim kuralı da düzenin yayımladığı açıklamanın parçasıdır.

Yeni bir düzen için algoritma seçerken neye bakılır?

Seçim, algoritmanın “iyi” olmasıyla değil, numaranın özellikleriyle ilgilidir. Dört soru çoğu durumu kapsar:

  • Numara ne kadar uzun? Uzun numaralarda küçük modül zayıf kalır.
  • Karakter kümesi yalnızca rakam mı, harf de içeriyor mu? Harf varsa harfin sayıya çevrilmesi kuralı gerekir.
  • Hatalar nereden geliyor: insan girişi mi, makine üretimi mi? İnsan girişinde komşu hane yer değiştirmesi sık görülür ve asimetrik ağırlık gerekir.
  • Kalan iki haneli olduğunda nasıl gösterilecek? Bu soru, modül büyüdükçe kaçınılmaz hâle gelir.

Bu dört soruya verilen cevaplar, ailenin hangi üyesinin uygun olduğunu büyük ölçüde belirler. Cevapsız kalan bir soru varsa, sonradan düzen değişikliği kaçınılmaz olur.

Bir de kapsam sınırı vardır: başka bir düzen için algoritma uydurulmaz. Bir numara türünü denetlerken o türün yayımladığı açıklama esas alınır ve uygulama, yayımlanmış örneklerle sınanır. Aksi hâlde başka bir düzenin parametreleri sessizce uygulanır ve sonuç yanlış olur.

Geliştiriciler için: ailenin sağladığı ortak yapı

Ailenin en büyük pratik faydası, tek bir hesap çekirdeğinin farklı parametrelerle kullanılabilmesidir. Ağırlık dizisi, modül ve eşleme kuralı dışarıdan verildiğinde, aynı çekirdek hem kısa hem uzun numaralarda, hem rakam hem harf içeren düzenlerde çalışır. Bu yaklaşımın alternatifi, her numara türü için ayrı bir hesap yazmaktır; o durumda aynı hata bütün kopyalarda tekrar eder.

İkinci nokta, ağırlıkların hangi uçtan başladığıdır. Bazı düzenler ağırlık dizisini soldan, bazıları sağdan başlatır. Aynı uzunluktaki iki numara türü, ağırlık başlangıcı farklı olduğu için farklı sonuç verir. Başlangıç yönü bu yüzden parametrelerin parçası olmalıdır, hesabın içine gömülü bir varsayım değil.

Üçüncü nokta, hesabın hangi karakterler üzerinde çalıştığıdır. Numara doğrulanmadan önce sadeleştirilmezse, ağırlık dizisi ayırıcı karakterlere de uygulanır ve sonuç anlamsızlaşır. Sadeleştirme, hesabın ön koşuludur.

Dördüncü nokta, aile üyelerinin birbirine karıştırılmamasıdır. Bir numara türü için yayımlanmış parametreler başka bir tür için geçerli değildir. Kod tarafında ortak çekirdek kullanmak yararlıdır; ama parametrelerin hangi türe ait olduğu açıkça ayrılmalıdır.

Beşinci nokta, aynı numara türü içinde birden çok sürüm bulunabilmesidir. Bir düzen zaman içinde ağırlık dizisini veya modülünü değiştirebilir ve eski numaralar eskisi gibi geçerli kalabilir. Bu durumda parametre kümesi türden değil tür ve sürüm ikilisinden okunmalıdır. Sürüm ayrımı yoksa, eski bir numara yeni kurala göre denendiği için haksız yere reddedilir.

Altıncı nokta, sonucun tek bir evet ya da hayır olmamasıdır. Hesap tutmadığında bile numara biçimsel olarak beklentiye uyuyor olabilir; hesap hiç çalıştırılamadığında ise sonuç olumsuz değil belirsizdir. Bu iki durumu aynı sonuca indirmek, kullanıcıya yanlış bir kesinlik verir.

Sonraki adımlar

İlk adım, desteklediğiniz her numara türü için ağırlık dizisi, modül ve eşleme kuralını tek bir yerde toplamak ve bunları yayımlanmış açıklamalarla karşılaştırmaktır. İkinci adım, her tür için en az bir olumlu ve bir olumsuz örnek bulundurmaktır; yalnızca olumlu örnekle sınanan bir hesap, hatayı yakalamayan bir hâlde de doğru görünür. Uzun ve harf içeren bir numarada ailenin nasıl davrandığını görmek için IBAN yapısı ve mod-97 yazısına, karmaşık bir kullanım örneği için CPF CNPJ doğrulama yazısına bakabilirsiniz. Elinizdeki bir numarayı denemek için numara doğrulama aracı hazırdır.

Bu bölümde anlatılan algoritma aileleri kamuya açık bilgilerdir; metinde geçen sayı örnekleri ve doğrulama çıktıları ise yalnızca anlatımı somutlaştırmak için kurgulanmış sentetik değerlerdir. Hiçbiri herhangi bir kurumun ürettiği gerçek bir numara değildir ve gerçek bir numaranın yerine kullanılamaz.

Okumaya devam edin

TC Kimlik Doğrulayıcı hakkında makaleler