UUID v4 Üretici
Kriptografik olarak güvenli rastgele UUID v4 oluşturur
…
Biçimle
UUID v4, modern yazılımda en yaygın kullanılan UUID sürümüdür. Bir zaman damgasından veya ad alanı karma değerinden bit türeten kardeş sürümlerinin aksine, UUID v4 tamamen rastgele veriden oluşur; bu da onu kaynağı hakkında meta veri taşımayan benzersiz bir tanımlayıcıya ihtiyaç duyduğunuzda en basit ve en taşınabilir seçenek hâline getirir.
Bu oluşturucu, işletim sisteminin kriptografik açıdan güvenli rastgele sayı üreticisinden — TLS anahtar malzemesi için kullanılan kaynağın aynısından — entropi alan yerel tarayıcı ve Node.js API'si olan crypto.randomUUID() fonksiyonunu kullanır.
UUID v4 Nedir?
Evrensel Benzersiz Tanımlayıcı (UUID), RFC 4122'de standartlaştırılmış 128 bitlik bir etikettir. Genellikle 8-4-4-4-12 deseninde tirelerle gruplandırılmış 32 onaltılık basamak olarak temsil edilir:
UUID v4'te 128 bitin 122'si rastgeledir. Geri kalan 6 bit, spesifikasyonun zorunlu kıldığı sabit alanlardır: 4 bit sürümü (0100 = 4) ve 2 bit RFC 4122 varyantını (10) kodlar. Bu sabit bitler, üçüncü grubun her zaman 4 ile başlamasının ve dördüncü grubun her zaman 8, 9, a veya b ile başlamasının sebebidir.
UUID v4 Anatomisi
550e8400-e29b-41d4-a716-446655440000 adresini inceleyelim:
| Bölüm | Bit | Anlam |
|---|---|---|
| 550e8400 | 32 rastgele | time_low (ad tarihseldir — v4'te tamamen rastgele) |
| e29b | 16 rastgele | time_mid (tarihsel ad — v4'te tamamen rastgele) |
| 41d4 | 4 sabit + 12 rastgele | Sürüm nibble'ı 4 (ikili 0100) + 12 rastgele bit |
| a716 | 2 sabit + 14 rastgele | Varyant bitleri 10 (ilk baytın MSB'leri) + 14 rastgele bit |
| 446655440000 | 48 rastgele | düğüm (v4'te tamamen rastgele) |
8, 9, a veya b'den biridir; çünkü o baytın yüksek iki biti 10'a sabitlenmiştir (RFC 4122 varyant işaretçisi), bu da geri kalan iki bitin serbestçe değişmesine olanak tanır.UUID v4 ile Diğer Sürümlerin Karşılaştırması
RFC 4122 beş UUID sürümü tanımlar. Her biri farklı bir sorunu çözer:
60 bitlik zaman damgasını (Ekim 1582'den itibaren 100 nanosaniyelik aralıklar) ana bilgisayar MAC adresiyle birleştirir. Bir makine içinde monoton artan.
Use when: sıralı ID'lere ihtiyacınız varsa ve sunucu kimliğini ile oluşturma zamanını açıklamak sizi rahatsız etmiyorsa.
Deterministik: aynı ad alanı + ad her zaman aynı UUID'yi üretir. MD5 karma kullanır.
Use when: bilinen bir ad alanından yeniden üretilebilir ID'lere ihtiyacınız varsa (ör. DNS adları). v3 yerine v5'i tercih edin.
122 bit kriptografik açıdan güvenli rastgelelik. Zaman damgası, MAC veya ad alanı yok. En yaygın genel amaçlı seçim.
Use when: yapısal anlam taşımayan ve maksimum gizlilik sunan benzersiz ID'lere ihtiyacınız varsa.
v3 gibi ancak SHA-1 kullanır. Ad alanı + addan hâlâ deterministik.
Use when: yeniden üretilebilir, içerik adresli tanımlayıcılara ihtiyacınız varsa (ör. URL ile tanımlanan kaynaklar için kararlı ID'ler).
Daha yeni (RFC 9562, 2024). Yüksek bitlere Unix milisaniye zaman damgası, ardından rastgele bitler kodlar. Sıralanabilir ve veritabanı dostu.
Use when: doğal zaman sıralamasıyla veritabanı dizini dostu ID'lere ihtiyacınız varsa (yeni projelerde v1 yerine tercih edin).
UUID v4 Ne Zaman Kullanılır
UUID v4, ek kısıtlamalar olmaksızın yalnızca "benzersiz bir ID" ihtiyacı duyulan durumların büyük çoğunluğunda doğru araçtır:
Kullanıcı ve hesap ID'leri
Hesap oluşturma zamanı veya sunucu kimliği hakkında hiçbir şey açıklamayan opak kullanıcı ID'leri. Numaralandırılamaz veya tahmin edilemez.
Veritabanı birincil anahtarları
Herhangi bir veritabanı motoruyla çalışır. UUID v4, koordinasyon gerektirmeden istemci tarafında oluşturulabilir ve dağıtık kaynaklardan birleştirilebilir — sıra tablosuna veya merkezi ID hizmetine gerek yoktur.
Oturum ve token ID'leri
122 bit rastgelelik, kaba kuvvetle tahmin etmeyi hesaplama açısından olanaksız kılar — 122 bitlik rastgele bir token ile karşılaştırılabilir güç sunar.
Dosya ve nesne adları
Yüklemeler, S3 nesne anahtarları veya önbellek girişleri için yinelemeyi önleyen dosya adları. İki istemcinin aynı anahtara yazma riski yoktur.
İdempotentlik anahtarları
İstek göndermeden önce istemci tarafında UUID oluşturun. Sunucu, paylaşılan bir sayaç olmaksızın yeniden denenen istekleri güvenle tekilleştirebilir.
Korelasyon ve iz ID'leri
Her günlük satırına ve dağıtık iz aralığına bir UUID ekleyin. Servisler veya makineler arasında koordinasyon gerekmez.
Çakışma Olasılığı
122 rastgele bit ile UUID v4 uzayı 2122 ≈ 5,3 × 1036 olası değer içerir. Çakışma olasılığı doğum günü problemi'ni izler:
Yaygın olarak aktarılan kıyaslama: tek bir çakışma için yüzde 50 şans elde etmek amacıyla yaklaşık 2,71 × 1018 UUID oluşturmanız gerekir. Saniyede 1 milyar UUID hızında bu, yaklaşık 85 yıl sürekli üretim demektir. Gerçek dünya uygulamalarında çakışmalar pratik bir endişe kaynağı değildir.
Kod Örnekleri
JavaScript — Tarayıcı ve Node.js 14.17+
crypto.randomUUID() yöntemi tüm modern tarayıcılarda (Chrome 92+, Firefox 95+, Safari 15.4+) ve Node.js 14.17+'da yerel olarak mevcuttur. Paket kurulumu gerekmez.
// Browser or Node.js 14.17+
const id = crypto.randomUUID()
// → "110e8400-e29b-41d4-a716-446655440000"
// Generate multiple
const ids = Array.from({ length: 5 }, () => crypto.randomUUID())Node.js — eski sürümler (uuid paketi)
const { v4: uuidv4 } = require('uuid')
const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"Python
import uuid # Generate a UUID v4 id = str(uuid.uuid4()) # → '110e8400-e29b-41d4-a716-446655440000' # The uuid module uses os.urandom() — cryptographically secure print(uuid.uuid4().hex) # without hyphens # → '110e8400e29b41d4a716446655440000'
Go
import "github.com/google/uuid" id := uuid.New().String() // → "110e8400-e29b-41d4-a716-446655440000" // Or using the standard library (Go 1.20+ with math/rand/v2 is NOT cryptographic) // Always prefer github.com/google/uuid for production use
Rust
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }use uuid::Uuid; let id = Uuid::new_v4().to_string(); // → "110e8400-e29b-41d4-a716-446655440000"
Sıkça Sorulan Sorular
UUID v4 kriptografik açıdan güvenli midir?
UUID v4 kendisi bir güvenlik ilkeli değildir — bir tanımlayıcı biçimidir. Ancak crypto.randomUUID() (tarayıcı veya Node.js) ya da eşdeğer işletim sistemi düzeyindeki API'ler aracılığıyla oluşturulduğunda altta yatan entropi kriptografik açıdan güvenlidir. Bu, UUID v4 değerlerinin tahmin edilemezliğin önem taşıdığı oturum token'ları veya idempotentlik anahtarları olarak kullanılmasına uygun olduğu anlamına gelir. Güvenlik açısından hassas bağlamlarda Math.random() tabanlı UUID oluşturucuları kullanmayın — yalnızca işletim sistemi CSPRNG'sinden açıkça yararlanan API'leri kullanın.
İki UUID v4 hiç eşit olabilir mi?
Teorik olarak evet, pratikte hayır. Herhangi bir gerçekçi veri kümesinde (milyarlarca ID) yinelenen UUID oluşturma olasılığı astronomik ölçüde küçüktür — donanım arızasının veri bozulmasına neden olmasından çok daha az olası. UUID v4 çakışması, üretim sistemi tasarımında imkânsız kabul edilir. Gerçekten sıfır çakışma garantisine ihtiyacınız varsa merkezi bir sayaç veya veritabanı dizisi kullanın.
UUID v4 mı, nanoid mi — hangisini kullanmalıyım?
Her ikisi de CSPRNG destekli rastgele ID oluşturuculardır. Temel farklar:
- UUID v4 RFC 4122 standardını izler, her veritabanı ve çerçeve tarafından tanınır ve sıfır bağımlılık gerektirir (yerel
crypto.randomUUID()). - nanoid URL güvenli bir alfabe kullanır ve varsayılan olarak daha kısadır (21 karakter ile 36 karakter). URL uzunluğu veya okunabilirlik önem taşıdığında kullanışlıdır. npm paketi gerektirir.
Dış sistemlerle birlikte çalışabilirlik önemliyse UUID v4'ü tercih edin (API'ler, veritabanları, günlük altyapısı). Daha kısa ID'ler istiyorsanız ve tam yığını kontrol ediyorsanız nanoid'i tercih edin.
UUID'leri veritabanlarında dize mi yoksa ikili olarak mı depolamalıyım?
Çoğu veritabanı için UUID veya BINARY(16) sütunu (16 bayt) olarak depolamak VARCHAR(36) dizisinden (36 bayt) daha verimlidir. PostgreSQL'in yerel bir uuid türü vardır. MySQL ve MariaDB, BINARY(16) ile UUID_TO_BIN() / BIN_TO_UUID() yardımcılarıyla iyi çalışır. SQLite kullanıcıları genellikle TEXT olarak depolar. Depolama seçiminin benzersizlik veya doğruluk üzerinde hiçbir etkisi yoktur.
UUID v4 neden tire içeriyor — ve bunları atlayabilir miyim?
Tireler, RFC 4122 tarafından tanımlanan kanonik UUID gösteriminin bir parçasıdır. Bunlar salt kozmetiktir — herhangi bir bilgi taşımaz ve 128 bitlik değeri etkilemez. Atlamak, işlevsel olarak eşdeğer 32 karakterlik bir onaltılık dize sağlar. Çoğu UUID ayrıştırıcısı her iki biçimi de kabul eder. Şüphe durumunda üçüncü taraf araçlar ve veritabanlarıyla maksimum uyumluluk için kanonik tireli biçimi kullanın.
const id = crypto.randomUUID() // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '') // "550e8400e29b41d4a716446655440000"