Python ile TC Kimlik Numarası Doğrulama Algoritması

Python TC Kimlik Numara Algoritması

Bir uygulama geliştirirken kullanıcıdan aldığınız T.C. kimlik numarasının gerçek bir kimlik numarası olup olmadığını anlayabilmemiz için matematiksel olarak bilmemiz gereken bir algoritma mevcut.

Bu yazımızda bu algoritmayı Python ile nasıl hazırlayacağımıza bakalım.

Önce genel geçer kuralları gözden geçirelim:

  1. T.C. kimlik numarası 0 ile başlayamaz
  2. T.C. kimlik numarasında sadece rakam olmalıdır
  3. T.C. kimlik numarası 11 haneli olmalıdır

T.C. Kimlik numarası sadece bu kurallara bağlı değildir. Bunun yanında 2 tane kuralımız daha var.

  1. T.C. kimlik numarası 10. rakamı: ilk 9 hanedeki 1. 3. 5. 7. ve 9. hanelerin toplamının 7 katından 2. 4. 6. ve 8. hanelerin toplamının çıkarılır ve %10 (mod 10) işlemine tabi tutulur.(Bu işlemin sonucu negatif çıkarsa üzerine 10 eklenir)
  2. T.C. kimlik numarasının 11. rakamı ise ilk 10 hanenin toplamının %10 işlemine tabi tutularak elde edilen sonuçtur.

Son iki kuralı anlamak için örnek olarak 10000000146 numarasını inceleyelim.

  • İlk 9 Hane: 1 0 0 0 0 0 0 0 1
  • Tek Hanelerin Toplamı (1., 3., 5., 7., 9. haneler): 1 + 0 + 0 + 0 + 1 = 2
  • Çift Hanelerin Toplamı (2., 4., 6., 8. haneler): 0 + 0 + 0 + 0 = 0
  • 10. Hane Hesaplama: ((2 * 7) – 0) % 10 = 14 % 10 = 4 (Numaranın 10. hanesi 4 ile uyumlu).
  • 11. Hane Hesaplama: İlk 10 hanenin toplamı (1+0+0+0+0+0+0+0+1+4 = 6)’nın birler basamağı 6‘dır (Numaranın 11. hanesi 6 ile uyumlu)

Şimdi Python kodumuza geçelim:

Python
def tc_kimlik_dogrula(tc_no: str) -> bool:
    """
    Verilen TC Kimlik numarasının matematiksel kurallara 
    uygun olup olmadığını kontrol eder.
    """
    # 2. ve 3. Kural (11 haneli ve sadece rakam
    if not tc_no.isdigit() or len(tc_no) != 11:
        return False
    
    # 1. kural İlk hane 0 olamaz
    if tc_no[0] == '0':
        return False

    # Rakamları integer listesine çevirelim
    digits = [int(d) for d in tc_no]
    
    # 4. Kural: 10. hanenin hesabı
    odd_sum = sum(digits[0:9:2])   # 1, 3, 5, 7, 9. haneler (index: 0, 2, 4, 6, 8)
    even_sum = sum(digits[1:8:2])  # 2, 4, 6, 8. haneler (index: 1, 3, 5, 7)
    
    digit_10 = (odd_sum * 7 - even_sum) % 10
    if digits[9] != digit_10:
        return False

    # 5. Kural: 11. hanenin hesabı
    digit_11 = sum(digits[:10]) % 10
    if digits[10] != digit_11:
        return False

    return True

# --- TEST ---
if __name__ == "__main__":
    print(tc_kimlik_dogrula("10000000146")) # Beklenen: True (Algoritma uyar)
    print(tc_kimlik_dogrula("12345678901")) # Beklenen: False

Similar Posts

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir