Bu rehberde, Go (Golang) 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 Go fonksiyonu 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.

Go ile TC Kimlik No Üretme Kodu

Aşağıda, yukarıdaki kurallara uygun rastgele TC Kimlik Numaraları üreten bir Go fonksiyonu bulunmaktadır. Go 1.20 ve sonrasında rand.Seed() kullanımına gerek yoktur; standart math/rand paketi otomatik olarak tohumlanır (seeded).

 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
package main

import (
	"fmt"
	"math/rand"
)

// GenerateTCNumber, geçerli bir TC Kimlik Numarası üretir.
// Dönen değer 11 haneli bir string'dir.
func GenerateTCNumber() string {
	// İlk 5 hane için rastgele sayı (10000-99999)
	randomPool1 := rand.Intn(90000) + 10000
	// Son 4 hane için rastgele sayı (1000-9999)
	randomPool2 := rand.Intn(9000) + 1000

	pool1Str := fmt.Sprintf("%d", randomPool1)
	pool2Str := fmt.Sprintf("%d", randomPool2)

	// İlk 5 ve son 4 hanenin rakamlarını topla
	k1Sum := 0
	for _, digit := range pool1Str {
		k1Sum += int(digit - '0')
	}

	k2Sum := 0
	for _, digit := range pool2Str {
		k2Sum += int(digit - '0')
	}

	// İlk 9 haneyi çapraz birleştirme yöntemiyle oluştur
	tckn := ""
	for i := 0; i < len(pool2Str); i++ {
		tckn += string(pool1Str[i]) + string(pool2Str[i])
	}
	tckn += string(pool1Str[len(pool1Str)-1]) // 9. hane

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

	digit11 := (k1Sum + k2Sum + digit10) % 10

	return tckn + fmt.Sprintf("%d", digit10) + fmt.Sprintf("%d", digit11)
}

func main() {
	// Tek bir TC Kimlik No üretme
	fmt.Println(GenerateTCNumber())
}

Kodun Çalışma Mantığı

  1. Rastgele üretim: rand.Intn() 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 i := 0; i < 5; i++ {
	fmt.Println(GenerateTCNumber())
}

Bir Dilim (Slice) Olarak Üretme

// GenerateTCNumbers, istenen sayıda TC Kimlik Numarası üretir
func GenerateTCNumbers(count int) []string {
	numbers := make([]string, count)
	for i := 0; i < count; i++ {
		numbers[i] = GenerateTCNumber()
	}
	return numbers
}

// Kullanım
testNumbers := GenerateTCNumbers(100)

Gin Web Çatısında REST API

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.GET("/api/tc/generate", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"tc_kimlik_no": GenerateTCNumber(),
		})
	})

	r.GET("/api/tc/generate-batch", func(c *gin.Context) {
		count := 5 // varsayılan
		c.JSON(http.StatusOK, gin.H{
			"numbers": GenerateTCNumbers(count),
		})
	})

	r.Run(":8080")
}

Performans ve Güvenlik Notları

  1. Rastgelelik: math/rand performans odaklıdır ve test verisi üretimi için yeterlidir. Kriptografik güvenlik gerektiren durumlarda crypto/rand paketini kullanmanız önerilir:

    import "crypto/rand"
    import "math/big"
    
    func secureRandomInt(max int) int {
        n, _ := rand.Int(rand.Reader, big.NewInt(int64(max)))
        return int(n.Int64())
    }
    
  2. Eşzamanlılık (Concurrency): Go’nun math/rand paketinin global fonksiyonları (rand.Intn vb.) goroutine-safe’dir; birden fazla goroutine aynı anda güvenle kullanabilir.

  3. Go sürüm notu: Go 1.20’den önceki sürümlerde rand.Seed(time.Now().UnixNano()) çağrısını init() fonksiyonunda yapmanız gerekir. Go 1.20+ sürümlerinde bu otomatiktir.

  4. Kullanım alanları:

    • Test verisi oluşturma (Go test paketleri)
    • Demo ve eğitim amaçlı projeler
    • Veritabanı seed verisi üretme
    • API mock yanıtları
  5. Yasal uyarı: Bu fonksiyon 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 fonksiyon gerçekten geçerli TC Kimlik Numaraları mı üretiyor?

C: Evet, bu fonksiyon 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: Gin, Echo veya Fiber projelerinde kullanabilir miyim?

C: Evet, bu fonksiyon saf Go ile yazılmıştır ve herhangi bir Go web çatısı (Gin, Echo, Fiber, Chi) veya CLI projesinde kullanılabilir. Herhangi bir harici bağımlılık gerektirmez.

S: Üretilen numaralar benzersiz mi?

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

S: math/rand yerine crypto/rand ne zaman kullanılmalı?

C: Test verisi için math/rand yeterlidir ve çok daha hızlıdır. Üretilen numaraların tahmin edilememesi gerekiyorsa crypto/rand kullanın.

Sonuç

Bu makalede, Go kullanarak nasıl geçerli TC Kimlik Numaraları oluşturabileceğinizi öğrendiniz. Bu kodu Go test paketlerinde test verisi oluşturmak, Gin/Echo 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.