UUID v4 Üretici

Kriptografik olarak güvenli rastgele UUID v4 oluşturur

Biçimle

Adet:

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:

550e8400-e29b-41d4-a716-446655440000

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ümBitAnlam
550e840032 rastgeletime_low (ad tarihseldir — v4'te tamamen rastgele)
e29b16 rastgeletime_mid (tarihsel ad — v4'te tamamen rastgele)
41d44 sabit + 12 rastgeleSürüm nibble'ı 4 (ikili 0100) + 12 rastgele bit
a7162 sabit + 14 rastgeleVaryant bitleri 10 (ilk baytın MSB'leri) + 14 rastgele bit
44665544000048 rastgeledüğüm (v4'te tamamen rastgele)
Note:Dördüncü grubun başındaki varyant nibble'ı her zaman 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:

UUID v1Zaman damgası + MAC

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.

UUID v3MD5 karma

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.

UUID v4Rastgele

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.

UUID v5SHA-1 karma

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).

UUID v7Zaman sıralı rastgele

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.

Note:Kullanım durumunuz sıralanabilir ID'ler gerektiriyorsa (ör. veritabanı satırlarının ekleme zamanına göre kümelenmesini istiyorsanız) bunun yerine UUID v7'yi değerlendirin. UUID v4 kasıtlı olarak rastgeledir ve yüksek ekleme hızlarında B-ağacı dizinlerinde parçalanmaya yol açar.

Ç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:

Oluşturulan UUID sayısıÇakışma olasılığı
1 milyar (109)~5,3 × 1018'de 1
1 trilyon (1012)~5,3 × 1012'de 1
1018 (1 eksabayt değerinde)~5.300'de 1

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.

js
// 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)

js
const { v4: uuidv4 } = require('uuid')

const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"

Python

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

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

toml
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }
rust
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.

js
const id = crypto.randomUUID()              // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '')     // "550e8400e29b41d4a716446655440000"