UUID Nedir?
UUID (Universally Unique Identifier — Evrensel Benzersiz Tanımlayıcı), merkezi bir koordinasyona ihtiyaç duymadan zaman ve mekânda benzersiz olacak şekilde tasarlanmış 128 bit'lik bir tanımlayıcıdır. Sonuç olarak 36 karakterlik şu format ortaya çıkar:
550e8400-e29b-41d4-a716-446655440000
Bu dize, kısa çizgilerle ayrılmış beş grupta düzenlenmiş 32 onaltılı rakamı kodlar: 8-4-4-4-12. İki belirli bit konumu sürüm ve varyant bilgisini taşır.
UUID Versiyonları
UUID v1 — Zaman Tabanlı + MAC Adresi
v1, güncel zaman damgasını ağ arayüzünün MAC adresiyle birleştirir. Tek bir makinede oluşturulma zamanına göre sıralıdır. Dezavantaj: Host makinenin MAC adresini ve tam oluşturulma zamanını ortaya koyar — gizlilik açısından sorun teşkil eder.
UUID v3 — Namespace + MD5
Deterministiktir: aynı girdi her zaman aynı UUID'yi üretir. MD5 kullanır — v5'i tercih edin.
UUID v4 — Rastgele (En Yaygın)
122 biti kriptografik olarak güvenli rastgele verilerle doldurur. Durum, ağ veya koordinasyon gerektirmez. Çoğu kullanım durumu için varsayılan tercihiniz olmalıdır.
UUID v5 — Namespace + SHA-1
v3 gibi ancak SHA-1 kullanır. Deterministik: aynı namespace + isim = her seferinde aynı UUID.
UUID v7 — Zaman Sıralı (Yeni Standart)
Unix milisaniye zaman damgasını en önemli bitlere yerleştirir ve arkasına rastgele veri ekler. UUID'leri doğal olarak sıralanabilir kılar ve veritabanı B-ağacı indeks performansını önemli ölçüde iyileştirir.
UUID Neden Kullanılır?
- Merkezi koordinasyon gerekmez: Herhangi bir istemci veya mikro servis bağımsız olarak UUID oluşturabilir.
- Güvenlik: Sıralı tamsayı ID'ler veri hacmini açığa çıkarır. UUID'ler hiçbir şey açıklamaz.
- Veritabanı birleştirme: Tamsayı ID'li tabloları birleştirmek çakışmalara yol açar. UUID anahtarlı tablolar çakışmasız birleşir.
- Çevrimdışı oluşturma: Mobil uygulamalar ve yerel-öncelikli yazılımlar çevrimdışıyken kayıt oluşturabilir ve daha sonra senkronize edebilir.
- Endüstri standardı: Her büyük veritabanı, ORM ve API çerçevesinde yerleşik destek bulunur.
UUID vs Diğer ID Türleri
| ID Türü | Uzunluk | Sıralanabilir | Notlar |
|---|---|---|---|
| Otomatik artan int | 4–8 byte | Evet | Kayıt sayısını açığa çıkarır; dağıtık DB'lerde sorunlu |
| UUID v4 | 16 byte / 36 karakter | Hayır | Evrensel destek; rastgele sıralama indekslerine zarar verir |
| UUID v7 | 16 byte / 36 karakter | Evet (ms) | DB birincil anahtarları için ideal |
| ULID | 26 karakter | Evet (ms) | Daha kısa, URL-güvenli; resmi standart değil |
| NanoID | ~21 karakter | Hayır | URL slug'ları için kısa, yapılandırılabilir alfabe |
UUID Ne Zaman Kullanılmaz?
- Depolama ek yükü: String olarak 36 byte alır.
BINARY(16)veya PostgreSQL'in nativeuuidtürünü kullanın. - URL slug'ları: Uzun ve hatırlanması zor. İnsan odaklı URL'ler için ayrı bir slug sütunu kullanın.
- v4 ile indeks parçalanması: Yüksek yazma hacimli tablolarda v7 veya ULID'i tercih edin.
VARCHAR(36) olarak saklamayın. UUID_TO_BIN(uuid, 1) ile BINARY(16) kullanın.
Kod ile UUID Oluşturma
JavaScript
const id = crypto.randomUUID(); // v4
// "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Python
import uuid
id_v4 = str(uuid.uuid4())
PHP
// ramsey/uuid paketi ile
use Ramsey\Uuid\Uuid;
$v4 = Uuid::uuid4()->toString();
$v7 = Uuid::uuid7()->toString();
SQL
-- MySQL
SELECT UUID();
-- PostgreSQL
SELECT gen_random_uuid();
UUID En İyi Uygulamaları
- Binary olarak saklayın —
BINARY(16)veya PostgreSQL nativeuuidtürü. - Çoğu durumda v4 kullanın.
- Veritabanı birincil anahtarları için v7 kullanın.
- Gizlilik açısından hassas bağlamlarda v1'den kaçının.
- Girişte UUID formatını doğrulayın:
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i - Küçük harf kullanımını tutarlı biçimde uygulayın.
Sıkça Sorulan Sorular
İki UUID hiç aynı olabilir mi?
Teorik olarak evet — olasılıksal, matematiksel değil. UUID v4 için çakışma olasılığı yaklaşık 5.3×1036'da 1'dir. Gerçek dünya sistemlerinde hiçbir zaman çakışmayla karşılaşmazsınız.
Veritabanı birincil anahtarları için v4 mü v7 mi?
v7 kullanın. v4 B-ağacı indeksinde rastgele konumlara ekleme yapar ve büyük ölçekte performansı düşürür. v7'nin milisaniye hassasiyetli zaman damgası öneki, yeni kayıtların her zaman indeksin sonuna eklenmesini sağlar.
UUID'ler büyük/küçük harfe duyarlı mı?
Hayır. Spesifikasyon büyük/küçük harf duyarsız olarak tanımlar. Kural olarak her zaman küçük harf kullanın.