Bu rehberde, Java programlama dilini kullanarak geçerli TC Kimlik Numaraları nasıl oluşturulacağını adım adım açıklayacağız. TC Kimlik No algoritması, belirli matematiksel kurallara dayanır ve bu kurallara uygun numaralar üretmek için bir Java metodu geliştireceğiz.

TC Kimlik No Algoritması Nedir?

TC Kimlik Numarası 11 haneden oluşur ve şu kurallara uyar:

  1. İlk hane sıfır olamaz
  2. 11. hane: İlk 10 hanenin toplamının 10’a göre modülüsü (birler basamağı) 11. haneyi verir
  3. 10. hane: (1., 3., 5., 7. ve 9. hanelerin toplamı) × 7 ile (2., 4., 6. ve 8. hanelerin toplamı) arasındaki farkın 10’a göre modülüsü 10. haneyi verir
  4. Tüm haneleri aynı rakamdan oluşan numaralar (11111111111 gibi) geçersizdir

Algoritmanın matematiksel detayı ve çalışan örnek için TC Kimlik Numarası Algoritması sayfamızı ziyaret edebilirsiniz.

Java ile TC Kimlik No Üretme Kodu

Aşağıda, yukarıdaki kurallara uygun rastgele TC Kimlik Numaraları üreten bir Java metodu bulunmaktadır. Bu metot, ilk 9 haneyi rastgele üretir ve ardından 10. ile 11. haneleri algoritmaya göre hesaplar.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.Random;

public class TCNumberGenerator {

    /**
     * Geçerli bir TC Kimlik Numarası üretir.
     * @return 11 haneli TC Kimlik Numarası (String)
     */
    public static String generateTCNumber() {
        Random rand = new Random();

        // İlk 5 hane için rastgele sayı (10000-99999)
        int randomPool1 = rand.nextInt(90000) + 10000;
        // Son 4 hane için rastgele sayı (1000-9999)
        int randomPool2 = rand.nextInt(9000) + 1000;

        String pool1Str = String.valueOf(randomPool1);
        String pool2Str = String.valueOf(randomPool2);

        // İlk 5 ve son 4 hanenin rakamlarını topla
        int k1Sum = 0;
        for (char c : pool1Str.toCharArray()) {
            k1Sum += Character.getNumericValue(c);
        }

        int k2Sum = 0;
        for (char c : pool2Str.toCharArray()) {
            k2Sum += Character.getNumericValue(c);
        }

        // İlk 9 haneyi çapraz birleştirme yöntemiyle oluştur
        StringBuilder tckn = new StringBuilder();
        for (int i = 0; i < pool2Str.length(); i++) {
            tckn.append(pool1Str.charAt(i)).append(pool2Str.charAt(i));
        }
        tckn.append(pool1Str.charAt(pool1Str.length() - 1)); // 9. hane

        // 10. ve 11. haneleri hesapla
        int digit10 = (k1Sum * 7 - k2Sum) % 10;
        if (digit10 < 0) digit10 += 10; // Negatif durum için

        int digit11 = (k1Sum + k2Sum + digit10) % 10;

        return tckn.toString() + digit10 + digit11;
    }

    public static void main(String[] args) {
        // Tek bir TC Kimlik No üretme
        System.out.println(generateTCNumber());
    }
}

Kodun Çalışma Mantığı

  1. Rastgele üretim: Random.nextInt() ile 5 haneli ve 4 haneli iki rastgele sayı üretilir. Bu sayılar, ilk 9 hanenin temelini oluşturur.
  2. Çapraz birleştirme: İki sayının rakamları birbiriyle iç içe geçirilerek (interleaving) ilk 9 hane oluşturulur. Bu yöntem, hanelerin dağılımını daha dengeli hale getirir.
  3. Kontrol basamakları: 10. hane (k1Sum × 7 − k2Sum) mod 10 formülüyle, 11. hane ise tüm ilk 10 hanenin toplamının mod 10’u ile hesaplanır.

Kullanım Örnekleri

Birden Fazla TC Kimlik No Üretme

// 5 adet TC Kimlik No üretme
for (int i = 0; i < 5; i++) {
    System.out.println(TCNumberGenerator.generateTCNumber());
}

Bir Liste Olarak Üretme

import java.util.ArrayList;
import java.util.List;

public static List<String> generateTCNumbers(int count) {
    List<String> numbers = new ArrayList<>();
    for (int i = 0; i < count; i++) {
        numbers.add(generateTCNumber());
    }
    return numbers;
}

// Kullanım
List<String> testNumbers = generateTCNumbers(100);

Spring Boot REST API’sinde Kullanım

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/tc")
public class TCNumberController {

    @GetMapping("/generate")
    public Map<String, String> generate() {
        return Map.of("tc_kimlik_no", TCNumberGenerator.generateTCNumber());
    }

    @GetMapping("/generate-batch")
    public Map<String, List<String>> generateBatch(
            @RequestParam(defaultValue = "5") int count) {
        return Map.of("numbers", TCNumberGenerator.generateTCNumbers(count));
    }
}

Performans ve Güvenlik Notları

  1. Rastgelelik: java.util.Random yeterince hızlıdır, ancak kriptografik güvenlik gerektiren durumlarda java.security.SecureRandom kullanmanız önerilir:

    SecureRandom secureRand = new SecureRandom();
    int randomPool1 = secureRand.nextInt(90000) + 10000;
    
  2. Thread güvenliği: Random sınıfı thread-safe değildir. Çok kanallı (multithreaded) ortamlarda her thread için ayrı bir Random örneği oluşturun veya ThreadLocalRandom kullanın:

    int randomPool1 = ThreadLocalRandom.current().nextInt(10000, 100000);
    
  3. Kullanım alanları:

    • Test verisi oluşturma (JUnit testleri, entegrasyon testleri)
    • Demo ve eğitim amaçlı projeler
    • Veritabanı seed verisi üretme
    • Form doğrulama testleri
  4. Yasal uyarı: Bu metot sadece test ve eğitim amaçlıdır. Gerçek TC Kimlik Numaralarıyla çalışırken kişisel verilerin korunması kanunlarına (KVKK) dikkat ediniz.

Sıkça Sorulan Sorular

S: Bu metot gerçekten geçerli TC Kimlik Numaraları mı üretiyor?

C: Evet, bu metot TC Kimlik No algoritmasına uygun numaralar üretir. Üretilen numaralar doğrulama kodumuzla test edildiğinde “Geçerli” sonucunu döndürür. Ancak üretilen numaralar yalnızca test amaçlı kullanılmalıdır.

S: Spring Boot veya Android projelerinde kullanabilir miyim?

C: Evet, bu metot saf Java ile yazılmıştır ve herhangi bir Java projesinde (Spring Boot, Android, Java EE, Jakarta EE) kullanılabilir. Herhangi bir harici bağımlılık gerektirmez.

S: Üretilen numaralar benzersiz mi?

C: Metot rastgele sayılar kullandığı için aynı numarayı tekrar üretme ihtimali vardır. Eğer benzersizlik gerekiyorsa, üretilen numaraları bir Set içinde toplayarak tekrarları filtreleyebilirsiniz.

S: Random yerine SecureRandom ne zaman kullanılmalı?

C: Test verisi için Random yeterlidir. Ancak üretilen numaraların tahmin edilememesi gerekiyorsa (örneğin güvenlik testleri için), SecureRandom kullanın.

Sonuç

Bu makalede, Java kullanarak nasıl geçerli TC Kimlik Numaraları oluşturabileceğinizi öğrendiniz. Bu kodu JUnit testlerinde test verisi oluşturmak, Spring Boot API’lerinde demo yanıtları üretmek veya veritabanı seed işlemlerinde kullanabilirsiniz.

İlgili İçerikler


Bu makalede verilen bilgiler ve kod örnekleri yalnızca eğitim ve test amaçlıdır. Resmi işlemler için her zaman Nüfus ve Vatandaşlık İşleri Genel Müdürlüğü’nün resmi kaynaklarını kullanınız.