Comparison
UUID v4 vs v7: veritabanı anahtarları için v7'yi seçin
Opak tokenlar için v4. Özellikle veritabanı anahtarları olmak üzere diğer her şey için v7.
By Buğra SözeriPublished
Özet. UUID v4, 122 bit saf rastgele ve sıralanamaz; bu durum veritabanı anahtarı olarak kullanıldığında B-ağacı indeks performansını yok eder. UUID v7 (RFC 9562, 2024), kimlikler oluşturma zamanına göre sıralanacak şekilde 48 bitlik Unix-milisaniye zaman damgasını öne ekler. Veritabanı anahtarları ve olay kimlikleri için v7; opak oturum tokenları için v4 kullanın.
UUID'ler, koordinasyon olmaksızın sistemler genelinde küresel olarak benzersiz olacak şekilde tasarlanmış 128 bitlik tanımlayıcılardır. Orijinal spesifikasyon (RFC 4122, 2005) beş versiyon tanımladı; v4 (saf rastgele), çoğu geliştiricinin kullandığı tek versiyondu. RFC 9562 (2024) v7'yi ekledi ve v7, v4'ün daha önce tercih edildiği hemen her kullanım senaryosunda yeni varsayılan olmalıdır.
Temel farklar
| Özellik | v4 | v7 |
|---|---|---|
| Belirtildi | RFC 4122 (2005) | RFC 9562 (2024) |
| Rastgele bit | 122 | 74 |
| Gömülü zaman damgası | Hayır | Evet (epoch'tan milisaniye cinsinden 48 bit) |
| Oluşturma zamanına göre sıralanabilir | Hayır (tamamen rastgele) | Evet (sözlüksel = kronolojik) |
| Çarpışma olasılığı | Herhangi bir çift için ~10³⁶'da 1 | Fiilen sıfır (zaman damgası + rastgele birleşim) |
| Veritabanı indeksi uyumu | Zayıf (rastgele ekleme B-ağaçlarını çalkalandırır) | Mükemmel (sıralı, ekleme dostu) |
| Tarayıcı desteği | 2021'den beri crypto.randomUUID() | Manuel üretim (henüz yerel API yok) |
v4 neden veritabanlarını yavaşlatır
Veritabanı birincil anahtarları genellikle bir B-ağacı indeksinde yaşar. B-ağaçları eklentiler sıralı düzende geldiğinde en iyi performansı gösterir: yeni anahtarlar en sağdaki yaprağa eklenir, yeniden dengeleme gerekmez, indeks sayfası önbellekte sıcak kalır.
Rastgele anahtarlar (v4) bunların hepsini bozar. Her ekleme rastgele bir sayfaya düşer, büyük ihtimalle sayfa bölünmesine yol açar, kesinlikle önbellek kayıplarına neden olur ve hiçbir zaman sıkıştırılmayan indeks genelinde dağılmış boş alan bırakır. Çok yazımlı iş yükleri için bu şu şekilde kendini gösterir:
- Aynı yazma hızında sıralı anahtarlara kıyasla 10-100× daha yüksek G/Ç
- Şişirilmiş indeks dosyaları (genellikle sıralı anahtarlarla boyutun 2-3×'i)
- Önbellek isabet oranı düştükçe sorgu yavaşlamaları
UUID v4'ü bigint birincil anahtarlarla karşılaştıran Postgres-vs-MySQL karşılaştırmaları, temsili iş yüklerinde tutarlı olarak 2-5× yazma aktarım hızı farkı gösterir. Çözüm UUID'lerden vazgeçmek değil — sıralanan UUID türünü kullanmak.
v7 nasıl görünür
Örnek bir v7 UUID:
01950d29-4f6f-7234-bf01-a8b3c0d9e102 └────zaman_damgası_ms────┘ └─rastgele─┘
İlk 48 bit: Unix zaman damgası milisaniye cinsinden (~10889 yılına kadar geçerli). Sonraki 4 bit: versiyon (her zaman 7). Sonraki 12 bit: rastgele. Ardından 2 bit varyant işaretleyicisi + 62 bit rastgele. Toplam rastgele: 74 bit — çarpışma direnci açısından rahat.
Aynı milisaniyede oluşturulan iki v7 UUID, 74 bit rastgele üzerinde rekabet eder; o milisaniye içindeki çarpışma olasılığı milyar kimlikli bir sistem için kabaca 10⁻²²'dir. Milisaniyeler arasında ise zaman damgası yapısal olarak çarpışmaları imkânsız kılar.
v4'ün hâlâ doğru seçim olduğu durumlar
- Opak oturum tokenları — oluşturma sırasının sızdırılmasını istemediğiniz durumlar. v7 ön ekte ~milisaniye çözünürlüğünde oluşturma zaman damgasını sızdırır; bu veritabanı anahtarları için sorun değil, gizlilik açısından hassas tokenlar için kötü.
- API anahtarları, erişim tokenları, parola sıfırlama tokenları: opaklık sıralanabilirlikten daha önemli.
- Anonimleştirme tanımlayıcıları: zaman damgasını gözlemlemek bir saldırganın korelasyon kurmasına yardımcı olacaksa.
v7'nin açıkça daha iyi olduğu durumlar
- Veritabanı birincil anahtarları.
- Dağıtık sistem kimlikleri (olay kimlikleri, sipariş kimlikleri, izleme kimlikleri).
- ORDER BY id ile kronolojik sıralama ücretsiz elde etmekten yararlanacağınız her yer.
- Oluşturma zamanında aralık sorgularının aksi takdirde created_at üzerinde ayrı bir indeks gerektireceği her yer.
Geçiş yolu
Yeni tablolar: başından v7 kullanın. Eski tablolar: genellikle geçişe değmez; ancak UUID anahtarlı bir tabloda yazma aktarım hızı tavanlarına çarpıyorsanız, v7'ye geçmek değerli bir yapısal değişikliktir.
Her ikisini de UUID oluşturucumuzla üretin; her iki versiyonu da destekler.
Sayısal gerçekler
- Dize uzunluğu: her ikisi de kısa çizgili 36 karakter (32 onaltılık + 4 kısa çizgi), kısa çizgisiz 32 karakter, base64url'de 22 karakter, ham 16 bayt.
- Entropi: v4 122 rastgele bit (6 bit versiyon + varyant işaretleyiciler tarafından kullanılır); v7 48 bitlik zaman damgasının ardından 74 rastgele bit.
- v4 çarpışma matematiği: ~2⁶¹ ≈ 2,3 × 10¹⁸ UUID oluşturduktan sonra %50 çarpışma olasılığı — saniyede bir milyar üretseniz 85 yıl beklerdiniz.
- v7 zaman damgası aralığı: 48 bitlik Unix-milisaniye alanı 1970 yılından 10889 yılına kadar kapsar.
- Postgres B-ağacı karşılaştırması (Percona, 2023): v4 ile saniyede ~7.000 ekleme, aynı donanım ve şemada v7/ULID ile ~28.000 ekleme — indeks RAM'i aşınca genişleyen 4× fark.
- İndeks şişmesi: 100 milyon satırlık v4 anahtarlı tablo, sayfa bölünmelerinin ardından kalan boş alan nedeniyle genellikle v7 veya sıralı bigint anahtarlı aynı veriden diskte 2-3× daha büyük olur.
- Üretim hızı:
crypto.randomUUID()(v4) Node 20'de saniyede ~3 milyon işlem; v7 uygulamaları (uuid v9, ulid) ~2,5 milyon işlem/saniye.
Karar matrisi
| Kullanım senaryosu | Tercih |
|---|---|
| Postgres / MySQL birincil anahtarı | v7 (veya ULID) |
| Dağıtık olay kimliği, izleme kimliği, sipariş kimliği | v7 |
| Oturum tokenı, CSRF tokenı | v4 (opaklık önemli) |
| Parola sıfırlama / sihirli bağlantı tokenı | v4 + kısa TTL |
| API anahtarı öneki | v4 |
| S3 nesne anahtarı (sıralanabilir liste) | v7 |
| Webhook tesliminde idempotency anahtarı | v7 (hata ayıklama dostu kronolojik sıra) |
| Herkese açık kısa ad | Ne biri ne diğeri — NanoID veya kısa hash kullanın |
Kaynaklar
- RFC 9562 — Evrensel Benzersiz Tanımlayıcılar (UUID'ler), Mayıs 2024 — rfc-editor.org/rfc/rfc9562 (v6, v7, v8 tanımlar; RFC 4122'nin yerini alır).
- Percona Blog — Veritabanlarında UUID'ler: Derinlemesine İnceleme, v4 ve sıralı anahtarlar karşılaştırması — percona.com.
Frequently asked questions
- UUID v7, v4 ile geriye dönük uyumlu mu?
- Evet — her ikisi de aynı 8-4-4-4-12 onaltılık biçimde 128 bitlik tanımlayıcılardır; her ikisi de v4 UUID kabul eden herhangi bir sütuna veya API'ye sığar ve her ikisi de sürümlerini aynı nibble'da kodlar. Geçiş tamamen yeni kimlik oluşturma şeklinizle ilgilidir; veritabanındaki mevcut v4'ler değişmeden çalışmaya devam eder.
- v7, oluşturma zaman damgasını sızdırıyor mu?
- Evet — ilk 48 bit, UUID'yi gören herkes tarafından okunabilir Unix milisaniye zaman damgasıdır. Çoğu veritabanı anahtarı için bu sorun değil, hatta yararlı; ancak oluşturma sırasını açıklamak istemediğiniz opak oturum tokenları veya parola sıfırlama kodları için v4'te kalın.
- v4 neden veritabanı performansını düşürüyor?
- Çünkü rastgele anahtarlar her ekleme işleminde B-ağacı indeksinin rastgele sayfalarına düşer; sayfa bölünmelerine yol açar ve önbellek yerelliğini yok eder. Sıralı anahtarlar (v7'nin zaman damgası ön eki gibi) en sağdaki yaprağa eklenir ve önbellek açısından verimli kalır. Postgres ve MySQL karşılaştırmaları genellikle 2-5× yazma aktarım hızı farkı gösterir.
- v7 UUID'leri tarayıcıda üretebilir miyim?
- Henüz yerel olarak değil — crypto.randomUUID() v4 döndürür. Küçük bir kütüphane (uuid v9+, ulid tabanlı çoklu dolgu) veya Date.now() ile crypto.getRandomValues() birleştiren 10 satır kod gerekir. Yerel v7 desteği WHATWG yol haritasında.
Related
Published May 15, 2026