
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:
- T.C. kimlik numarası 0 ile başlayamaz
- T.C. kimlik numarasında sadece rakam olmalıdır
- 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.
- 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)
- 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