UUID Oluşturucu rehberi
XGM UUID Oluşturucu aracı UUID v4, UUID v7 ve ULID nasıl üretir, biçimler nasıl farklıdır, veritabanı anahtarı için hangisi seçilir ve bir UUID nasıl çözülür.
UUID nedir
Evrensel benzersiz tanımlayıcı (UUID), Microsoft ekosistemlerindeki adıyla GUID, beş grup halinde 32 onaltılık basamakla yazılan 128 bitlik bir değerdir; örneğin 018f3a2e-7b1c-7d2a-9f4e-2b6c8a1d3e5f. Sistemler UUID'leri merkezi bir sayaca ihtiyaç duymadan, birbirinden bağımsız olarak üretir ve rastgele iki UUID'nin çakışma olasılığı ihmal edilebilir düzeydedir. Bu özellik onları veritabanı anahtarı, istek kimliği ve dosya adı olarak yaygın biçimde kullanılan bir araç haline getirir. Aynı kaydı farklı sunucularda, farklı süreçlerde ya da çevrimdışı bir istemcide üretseniz bile, kimseye danışmadan çakışmayan bir kimlik elde edersiniz. Otomatik artan tam sayıların aksine bir UUID, kaç kayıt oluşturduğunuzu ya da bir sonraki kaydın kimliğini dışarıya sızdırmaz.
RFC 9562 (2024), özgün RFC 4122 belgesinin yerini aldı ve başta v7 olmak üzere yeni sürümler ekledi. Her UUID'nin dört biti sürümü, iki ya da üç biti ise varyantı saklar; on üçüncü onaltılık basamağın sürüm numarasını göstermesinin nedeni budur. Varyant bitleri on yedinci basamağın başında durur ve değerin geri kalanının hangi düzeni izlediğini söyler. Bu iki alanın yeri sabit olduğu için, bir değeri üreten kütüphaneyi bilmeseniz bile onu ayrıştırabilirsiniz. Eski RFC 4122 numarasına yapılan atıflar hâlâ dolaşımdadır, ama biçim aynı kaldığından eski ve yeni belgelere göre üretilmiş değerler birbiriyle uyumludur.
UUID Oluşturucu aracı nasıl kullanılır
- UUID Oluşturucu aracını açın ve tanımlayıcı türünü seçin: UUID v4, UUID v7 ya da ULID.
- Kaç tane üretileceğini ve harflerin büyük yazılıp yazılmayacağını seçin.
- Oluştur düğmesine basın ve tanımlayıcıları kopyalayın.
- Mevcut bir UUID'yi incelemek için onu Bir UUID çözün alanına yapıştırın; sürümünü, varyantını ve gömülü zamanını orada görürsünüz.
Değerler tarayıcının güvenli rastgelelik kaynağıyla üretilir ve hiçbir yere gönderilmez; bu yüzden test verisinde ya da yapılandırma dosyalarında doğrudan tanımlayıcı olarak kullanılabilirler. Sayfa çevrimdışıyken de çalışır, çünkü üretme ve çözme işlemlerinin tamamı sekmenizin içinde gerçekleşir. Sorgu dizesine hiçbir girdi yazılmaz, dolayısıyla çözdüğünüz bir UUID tarayıcı geçmişinde de kalmaz. Toplu üretim, geliştirme ortamı için örnek kayıt hazırlarken ya da bir test veri kümesini doldururken işinizi hızlandırır. Çok büyük hacimler için aynı işi kodda yapmak daha pratiktir; bunun örnekleri aşağıda.
v4, v7 ve ULID arasında seçim yapmak
| Tür | Yapısı | Zamana göre sıralanır | En uygun kullanım |
|---|---|---|---|
| UUID v4 | 122 rastgele bit | Hayır | Sıranın önemli olmadığı genel amaçlı tanımlayıcılar |
| UUID v7 | 48 bitlik ms zaman damgası + rastgele bitler | Evet | Veritabanı birincil anahtarları, olay ve günlük kimlikleri |
| ULID | 48 bitlik ms zaman damgası + 80 rastgele bit, 26 Crockford base32 karakteri | Evet | URL ve dosya adlarında kısa, sıralanabilir kimlikler |
| UUID v1 | Zaman damgası + düğüm tanımlayıcısı (çoğunlukla bir MAC adresi) | Kısmen | Eski sistemler; makine bilgisini sızdırabilir. XGM rastgele bir düğüm kimliği kullanır, dolayısıyla hiçbir şey sızdırmaz |
| UUID v3 / v5 | Bir ad alanı UUID'si ile bir adın MD5 ya da SHA-1 özeti | Hayır | Aynı adın her zaman aynı kimliği vermesi gereken yerler; yeni işler için v5 |
Rastgele v4 anahtarları eklemeleri veritabanı dizininin her yerine dağıtır; bu da büyük tablolarda sayfa bölünmelerine ve önbellek ıskalarına yol açar. Zaman sıralı v7 anahtarları ise otomatik artan tam sayılara benzer biçimde dizinin sonuna yakın eklenir ve UUID'lerin sağladığı faydaları korur. UUID'leri birincil anahtar olarak saklayan yeni sistemlerde v7 genellikle daha iyi bir varsayılandır. Aynı fayda, zamana göre aralık sorgusu yapılan olay ve günlük tablolarında da geçerlidir; anahtarın kendisi kaba bir zaman sırası taşır. Mevcut bir tabloyu v4'ten v7'ye taşımak zorunlu değildir; yalnızca yeni kayıtlarda v7 kullanmak bile dizinin büyüme davranışını düzeltir.
v7 oluşturulma zamanını açık eder
Bir UUID'yi çözmek
Sürüm basamağı bir UUID'nin nasıl üretildiğini söyler. v1 ve v7 için çözücü zaman damgasını da çıkarır ve bunu tarih olarak gösterir. Varyant da gösterilir: RFC 9562'yi izleyen değerler bu şekilde etiketlenir, eski şartnamelerden gelen NCS, Microsoft ve gelecek varyantları ise ayrılmış olarak işaretlenir. Tamamı sıfır olan nil ve tamamı f olan max değerleri, sürüm numarası yerine adlarıyla bildirilir. Girdi geçerli bir UUID değilse araç bunu ayrıca söyler; böylece kopyalama sırasında kırpılmış bir değeri hemen fark edersiniz.
Çözme, hata ararken işe yarar. Bir günlük satırındaki v7 anahtarı, kaydın ne zaman oluşturulduğunu veritabanına sormadan söyler; yeni bir sistemde beklenmedik bir v1 UUID'si ise eski bir kütüphaneye ya da hâlâ zaman-ve-düğüm tanımlayıcıları kullanan bir bileşene işaret eder. Nil ve max UUID'leri test verisinde ve varsayılan değerlerde yer tutucu olarak karşınıza çıkar. İki sistemin aynı kaydı farklı kimliklerle tuttuğundan şüpheleniyorsanız, sürüm ve varyant karşılaştırması hangi değerin hangi kütüphaneden geldiğini hızla gösterir. Gömülü zamanın bugünden çok uzağa düşmesi de genellikle sunucu saatinin kaydığını haber verir.
018f3a2e-7b1c-7d2a-9f4e-2b6c8a1d3e5f
^ ^
| variant: 9 → binary 10xx (RFC 9562)
version: 7
f47ac10b-58cc-4372-a567-0e02b2c3d479
^ ^
| variant: a → RFC 9562
version: 4 (random)| Değer | Anlamı |
|---|---|
00000000-0000-0000-0000-000000000000 | Nil UUID, çoğunlukla "değer yok" anlamında kullanılır |
ffffffff-ffff-ffff-ffff-ffffffffffff | Max UUID, RFC 9562 belgesinde tanımlanmıştır |
Kod içinde UUID üretmek
Çoğu platform v4 UUID'lerini kendi başına üretir; v7 desteği de standart kütüphanelerde ve veritabanı eklentilerinde hızla yaygınlaşıyor. Bir platformda v7 yoksa, RFC 9562'yi uygulayan küçük ve bakımı sürdürülen kütüphaneler vardır; şartnamedeki örneklere karşı test etmediğiniz sürece zaman damgasını kendiniz paketlemeye kalkışmayın. Hangisini kullanırsanız kullanın, rastgele kısmın kriptografik olarak güvenli bir üreteçten geldiğinden emin olun. Math.random gibi hızlı ama tahmin edilebilir kaynaklar bu iş için uygun değildir. Kütüphane seçerken sürüm ve varyant bitlerini şartnameye uygun yazdığını ve bunu kendi testleriyle doğruladığını kontrol edin.
// Browser and Node.js: v4
crypto.randomUUID()
# Python 3: v4 (uuid7 is available in newer versions)
python3 -c "import uuid; print(uuid.uuid4())"
-- PostgreSQL: v4 built in
SELECT gen_random_uuid();Tanımlayıcıları kaydın oluşturulduğu yerde, yani genellikle uygulamanın içinde üretin; böylece kimlik, veritabanına ekleme yapılmadan önce bilinir. Bu sayede ilişkili kayıtları oluşturmak, olay yayımlamak ve yeni kimliği istemciye döndürmek için fazladan bir gidiş dönüş gerekmez. Aynı yaklaşım, sonradan eşitlenen çevrimdışı istemcilerde de çalışır. Yeniden denenen bir istek aynı kimliği taşıdığında, ekleme işlemini yinelenmeye karşı bağışık hale getirmek de kolaylaşır. Kimliği veritabanı varsayılanına bırakmak yerine uygulamada üretmek, kodun testini de basitleştirir.
Dağıtık sistemlerde UUID v7'nin milisaniye zaman damgası, her makinenin kendi saatinden gelir. Saati kaymış makinelerden gelen değerler yine kabaca zamana göre sıralanır, ama kusursuz biçimde değil; bu yüzden katı bir olay sıralaması için yalnızca UUID sırasına güvenmeyin. Sıra gerçekten önemliyse kaydın yanına ayrı bir zaman damgası ya da sıra numarası yazın. Sunucularda NTP eşitlemesini açık tutmak, sapmayı milisaniyeler düzeyinde tutar. Aynı milisaniye içinde üretilen değerlerin sırası rastgele kısma bağlıdır; RFC 9562 bunun için isteğe bağlı bir monoton sayaç tanımlar.
UUID'leri saklamak
UUID'leri, veritabanınızda varsa yerel bir UUID tipinde saklayın; örneğin PostgreSQL'deki uuid tipinde ya da 16 baytlık ikili veri olarak. 36 karakterlik metin biçimi iki katından fazla yer kaplar, dizinleri büyütür ve yavaşlatır. Metne yalnızca sistemin dış sınırlarında, API'lerde ve günlüklerde dönüştürün. Yerel tipi olmayan veritabanlarında sabit uzunluklu ikili bir sütun, karakter sütununa göre hem daha küçük hem de karşılaştırması daha hızlıdır. Sütun tipini baştan doğru seçmek, tablo büyüdükten sonra yapılacak bir göçten çok daha ucuza gelir.
CREATE TABLE orders (
id uuid PRIMARY KEY,
created_at timestamptz NOT NULL DEFAULT now(),
customer_email text NOT NULL
);
-- application generates UUID v7 values, for example for an order from anna@example.com- Metin biçimindeki UUID'leri büyük/küçük harf ayrımı gözetmeden karşılaştırın; RFC 9562 çıktının küçük harfle yazılmasını önerir.
- UUID'leri gizli anahtar olarak kullanmayın. v4 değerlerini tahmin etmek zordur, ama bunlar erişim belirteci olarak değil tanımlayıcı olarak tasarlanmıştır.
- v4 UUID'lerinden anlam çıkarmaya çalışmayın; yalnızca v1, v6 ve v7 sürümleri zaman damgası taşır.
SSS
İki UUID aynı olabilir mi?
Kuramda evet, pratikte hayır. Rastgele v4 UUID'lerinde 122 rastgele bit vardır; yıllarca saniyede milyarlarca değer üretseniz bile çakışma olasılığı ihmal edilebilir düzeyde kalır.
GUID ile UUID aynı şey mi?
Evet. GUID, aynı 128 bitlik tanımlayıcı biçimi için Microsoft'un kullandığı addır.
Birincil anahtar için UUID v7 kullanmalı mıyım?
Yeni sistemlerde genellikle evet. Zaman sıralı değerler, rastgele v4 anahtarlarının aksine veritabanı dizinlerini derli toplu ve eklemeleri hızlı tutar.
ULID nedir?
48 bitlik milisaniye zaman damgası ve 80 rastgele bit içeren, 26 base32 karakteriyle yazılan 128 bitlik bir tanımlayıcıdır. Zamana göre sıralanır ve metin biçiminde bir UUID'den kısadır.
Bir UUID v4'ten oluşturulma zamanını alabilir miyim?
Hayır. v4 tamamen rastgeledir. Yalnızca v1, v6 ve v7 gibi zaman tabanlı sürümler zaman damgası içerir.
Üretilen UUID'ler XGM'ye gönderiliyor mu?
Hayır. Değerler tarayıcınızda üretilir ve hiçbir zaman yüklenmez.
Büyük harf mi, küçük harf mi?
İkisi de aynı değeri temsil eder. RFC 9562 üretim sırasında küçük harfi önerir; karşılaştırmalar ise harf durumunu yok saymalıdır.
Bir UUID API anahtarı olarak kullanılabilir mi?
Kullanmamak daha doğrudur. Gizli anahtarları güvenli bir rastgele üreteçle ve yeterli uzunlukta üretin; tanımlayıcılar ile gizli anahtarları birbirinden ayrı şeyler olarak ele alın.
Tek seferde kaç UUID üretebilirim?
Araç, test verisi ve başlangıç verisi için toplu üretim yapar. Çok büyük hacimlerde bunları kodda üretin; aynı rastgelelik kaynağı orada da vardır ve sayfadan kopyalamanız gerekmez.
v7 UUID'im neden bir öncekine benziyor?
Aynı milisaniye içinde üretilen UUID'ler ilk 12 onaltılık basamağını, yani zaman damgasını paylaşır. Sürüm basamağından sonraki rastgele kısım yine de her değeri benzersiz kılar.
Sürüm 6 ve 8 nedir?
Sürüm 6, v1 zaman damgasını sıralamaya uygun olacak şekilde yeniden düzenler; sürüm 8 ise özel düzenler için serbest biçimli bir kalıptır. İkisi de RFC 9562 belgesinde tanımlanmıştır.