Bir TC Kimlik Numarası’nın algoritmik olarak geçerli olup olmadığını kontrol etmek, yazılım geliştirmede en sık karşılaşılan form doğrulama (validation) işlemlerinden biridir. Bu makalede, TC Kimlik Numarası algoritmasının 10. ve 11. hane kontrol kurallarını beş farklı programlama dilinde nasıl uygulayacağınızı göstereceğiz.
Doğrulama mantığı tüm dillerde aynıdır — tek sıradaki hanelerin toplamının 7 katından çift sıradaki hanelerin toplamını çıkarıp mod 10 alarak 10. haneyi, ilk 10 hanenin toplamının mod 10’unu alarak 11. haneyi kontrol ederiz. Ancak her dilin sunduğu araçlar (yerleşik fonksiyonlar, tip güvenliği, string işleme yetenekleri) farklı olduğu için uygulama detayları da farklılık gösterir.
Doğrulama Mantığı Özeti
TC Kimlik Numarası 11 haneden oluşur ve şu kurallara uyar:
- 11 haneli olmalıdır ve yalnızca rakamlardan oluşmalıdır
- İlk hane sıfır (0) olamaz
- 10. hane kontrolü: (d₁+d₃+d₅+d₇+d₉) × 7 − (d₂+d₄+d₆+d₈) işleminin 10’a göre modülüsü 10. haneye eşit olmalıdır
- 11. hane kontrolü: İlk 10 hanenin toplamının 10’a göre modülüsü 11. haneye eşit olmalıdır
Bu kuralların matematiksel detayı ve çalışan örnek için algoritma sayfamızı ziyaret edebilirsiniz. Aşağıda her programlama dili için bu kuralları uygulayan tam fonksiyonları bulacaksınız.
PHP ile TC Kimlik No Doğrulama
PHP, web geliştirmede TC Kimlik No doğrulama ihtiyacının en sık ortaya çıktığı dillerden biridir. PHP’nin yerleşik ctype_digit() fonksiyonu, bir string’in yalnızca rakamlardan oluşup oluşmadığını kontrol etmekte son derece etkilidir ve regex kullanmaktan daha hızlıdır. Ayrıca array_map, array_sum ve array_slice fonksiyonları, dizi işlemlerini tek satırlarda halletmemizi sağlar.
| |
Laravel’de kullanım: Bu fonksiyonu bir Validation Rule sınıfına sararak form request’lerinde şık bir şekilde kullanabilirsiniz:
// app/Rules/ValidTCNumber.php
class ValidTCNumber implements ValidationRule
{
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (!validateTCNumber($value)) {
$fail('Geçersiz TC Kimlik Numarası.');
}
}
}
// Form Request'te kullanım
public function rules(): array
{
return [
'tc_kimlik_no' => ['required', 'string', new ValidTCNumber()],
];
}
Python ile TC Kimlik No Doğrulama
Python, syntax’ın okunabilirliği ve list comprehension’ların gücü sayesinde TC Kimlik No doğrulama algoritmasını en net şekilde ifade edebilen dillerden biridir. str.isdigit() metodu tip kontrolü için yeterlidir; dilimleme (slicing) ve adımlı (step) slicing (digits[0:9:2]) ise tek sıradaki ve çift sıradaki haneleri ayrıştırmayı tek satırda yapar.
| |
Django’da kullanım: Django’da bu fonksiyonu bir form field doğrulayıcısı olarak kaydedebilirsiniz:
# validators.py
from django.core.exceptions import ValidationError
def validate_tc_number(tckn):
if not validate_tc_number(tckn):
raise ValidationError("Geçersiz TC Kimlik Numarası.")
# forms.py
from django import forms
from .validators import validate_tc_number as tc_validator
class UserProfileForm(forms.Form):
tc_kimlik_no = forms.CharField(
max_length=11,
validators=[tc_validator],
label="TC Kimlik Numarası"
)
JavaScript ile TC Kimlik No Doğrulama
JavaScript’te TC Kimlik No doğrulama, hem tarayıcı tarafında hem de Node.js ortamında çalışır. Tarayıcıda, kullanıcı formu göndermeden önce anında geri bildirim sağlayarak kullanıcı deneyimini iyileştirir. filter() ve reduce() metotları ile fonksiyonel bir yaklaşım benimsenir; regex (/^[0-9]+$/) ise tip kontrolü için kullanılır.
| |
Tarayıcıda form entegrasyonu: Bu fonksiyonu bir HTML formunun submit olayına bağlayarak sunucuya istek gitmeden önce doğrulama yapabilirsiniz:
document.querySelector('#tcForm').addEventListener('submit', function(e) {
const tcInput = document.querySelector('#tcInput').value;
if (!validateTCNumber(tcInput)) {
e.preventDefault();
alert('Lütfen geçerli bir TC Kimlik Numarası giriniz.');
}
});
Java ile TC Kimlik No Doğrulama
Java’nın statik tip sistemi, TC Kimlik No doğrulama mantığını kurumsal uygulamalarda (Spring Boot, Java EE) güvenli bir şekilde uygulanmasını sağlar. Java’da regex ile tip kontrolü yapılır (String.matches("^[0-9]+$")), döngülerle haneler ayrıştırılır. Kotlin, Scala veya Kotlin/Java karışık projelerde de aynı mantık kullanılabilir.
| |
Spring Boot’ta kullanım: Spring’de bir @Constraint annotation’ı oluşturarak bu doğrulamayı Bean Validation çerçevesine entegre edebilirsiniz:
// Custom annotation ve validator
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TCNumberValidator.class)
public @interface ValidTCNumber {
String message() default "Geçersiz TC Kimlik Numarası";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class TCNumberValidator implements ConstraintValidator<ValidTCNumber, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && TCKimlikNoValidator.validateTCNumber(value);
}
}
Go ile TC Kimlik No Doğrulama
Go’nun minimal ve performans odaklı tasarımı, TC Kimlik No doğrulama fonksiyonunu son derece verimli hale getirir. Go’da regexp.MatchString ile tip kontrolü yapılır, dilim işlemleri (slice) ile haneler ayrıştırılır. Go’nun statik tip güvenliği ve derlenmiş doğası, bu fonksiyonu yüksek trafikli API servislerinde gönül rahatlığıyla kullanmanızı sağlar.
| |
Gin veya Echo’da kullanım: Go web çatılarında bu fonksiyonu bir middleware veya handler içinde çağırabilirsiniz:
func validateTCMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
tcNo := c.PostForm("tc_kimlik_no")
if !validateTCNumber(tcNo) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Geçersiz TC Kimlik Numarası"})
c.Abort()
return
}
c.Next()
}
}
Sıkça Sorulan Sorular
S: Bu doğrulama fonksiyonu gerçek bir TC Kimlik Numarasını garanti eder mi?
Hayır. Bu fonksiyon yalnızca numaranın algoritmik olarak geçerli olup olmadığını kontrol eder — yani 10. ve 11. hanelerin doğru hesaplandığını. Numaranın gerçekten bir vatandaşa ait olduğunu doğrulamak için e-Devlet üzerinden NVİ’nin resmi servisini kullanmanız gerekir.
S: Hangi programlama dilini seçmeliyim?
Projenizin kullandığı dile bağlıdır. Eğer bir REST API geliştiriyorsanız Python/Flask, PHP/Laravel veya Go/Gin tercih edebilirsiniz. Tarayıcı tarafında anlık doğrulama için JavaScript versiyonunu kullanın. Her versiyon aynı matematiksel sonucu üretir.
S: Tüm dillerde aynı test numarasını kullanabilir miyim?
Evet, 10000000146 örneği tüm dillerde “Geçerli” sonucunu döndürür ve herhangi bir gerçek kişiye ait olduğu garanti edilmeyen bir test numarasıdır.
S: Doğrulama başarısız olursa kullanıcıya nasıl mesaj göstermeliyim?
Doğrulama başarısız olduğunda kullanıcıya spesifik bir mesaj gösterin: “Girdiğiniz TC Kimlik Numarası 11 haneli olmalıdır” veya “TC Kimlik Numarası geçersiz — lütfen kontrol ediniz”. Genel bir “hata” mesajı yerine, hatanın nedenini açıklayan mesajlar kullanıcı deneyimini iyileştirir.
İlgili İçerikler
- TC Kimlik Numarası Algoritması — Algoritmanın matematiksel detayları ve çalışan örnek
- PHP ile TC Kimlik No Oluşturma — Geçerli test numaraları üretme
- Python ile TC Kimlik No Oluşturma — Python ile test verisi üretme
- JavaScript ile TC Kimlik No Oluşturma — JS ile test verisi üretme
- TC No Doğrula Aracı — Online doğrulama aracı
Bu makalede verilen kod örnekleri eğitim ve test amaçlıdır. Gerçek TC Kimlik Numaralarıyla çalışırken kişisel verilerin korunması kanunlarına (KVKK) dikkat ediniz.