UUID Üretici
RFC 4122 UUID üret (v4 rastgele veya v7 zaman sıralı). 100'e kadar toplu. Kriptografik olarak güvenli.
Bu ne işe yarar?
Bir UUID (veya GUID) 128-bit bir tanımlayıcıdır — 550e8400-e29b-41d4-a716-446655440000 gibi 5 grupta 32 hex basamak olarak yazılır. Koordinasyon olmadan sistemler arasında çarpışmasızlardır: herhangi bir yerde herhangi bir süreç bir tane basabilir ve ikisinin çarpışma olasılığı pratikte sıfırdır. Veritabanına konuşmadan önce bir ID gerektiğinde, satır sayılarının sızmasını önlemek istediğinde veya bir ID'nin istemci tarafında üretilip sonra senkronize edilmesi gerektiğinde kullanışlıdır. Bu araç v4 (rastgele) veya v7 (zaman-sıralı) biçiminde RFC 4122 / RFC 9562 uyumlu UUID'ler yayar, tarayıcında kriptografik olarak güvenli rastgelelikle üretilir.
Ne zaman kullanılır
- Bir ID için veritabanına round-trip yapmak istemediğin dağıtık sistemler için birincil anahtarlar.
- API istekleri için idempotency anahtarları (stripe, ödeme sağlayıcıları, queue mesajları).
- Dosya yükleme tanımlayıcıları, oturum token'ları, loglarda correlation ID'ler.
- Aksi takdirde otomatik artan bir ID'yi açığa çıkardığın ve kaç kaydın olduğunu sızdırdığın herhangi bir yer.
- Test verisi — tek tıkla yüz kayıt gerçekçi tanımlayıcılarla seed et.
v4 - v7 — hangisini kullanmalı?
- v4 (rastgele) — 122 bit rastgelelik, gömülü oluşturma zamanı yok. ID'ler ve oluşturma sırası arasında sıfır korelasyon istediğinde veya ID'nin sıralamanın önemli olmadığı hash-map / non-clustered indekste yaşayacağı zaman kullan.
- v7 (zaman-sıralı) — 48-bit Unix-ms timestamp öneki + rastgele kuyruk. Yeni veritabanı birincil anahtarları için varsayılan olarak bunu kullan. Timestamp öneki B-tree indekslerine locality verir (son insert'ler aynı sayfalara gider, v4'ten çok daha iyi cache davranışı) ve ID'ler kabaca kronolojik sırada sıralanır. RFC 9562'de tanımlandı (Mayıs 2024) — çoğu kullanım durumu için ULID ve v1/v6'nın yerini alır.
Sık yapılan hatalar
- UUID'ler sır değildir. v4'ün 122 bit entropisi vardır ve tahmin edilemezdir, ama biçimin kendisi hiçbir şey yetkilendirmez. Bir oturum token'ı veya parola sıfırlama token'ı olarak UUID kullanma, onu bir sır gibi ele almıyorsan (yalnızca HTTPS, zaman sınırlı, tek kullanımlık).
- v7 oluşturma zamanını sızdırır. İlk 48 bit basıldığı milisaniyeyi kodlar. Dahili ID'ler için iyidir; kullanıcıların kayıtların ne zaman oluşturulduğunu öğrenmesini istemiyorsan kötü. Bu durumda v4 kullan.
- İndeks boyutu önemlidir. Bir UUID bigint için 8 byte'a karşı 16 byte'tır — B-tree indekslerin büyür. Dağıtık/koordinasyonsuz için değer, sıralı ID olan tek sunucu uygulamaları için sıklıkla değmez.
- v4 veritabanı indekslerini parçalar. Rastgele ID'ler yazmaları indeks boyunca dağıtır, sayfa cache hit oranına ve yazma throughput'una zarar verir. Bu v7 için orijinal argümandır.
- v1 kullanma. Eski zaman-ve-MAC varyantı üreten makinenin MAC adresini sızdırır. v7 modern yedektir.
- Kripto-güvenli rastgelelik kullan. Bu araç
crypto.getRandomValueskullanır; aslaMath.randomile kendini yapma — yeterince rastgele değildir ve ID'ler öngörülebilir olur.