İçeriğe geç

UUID Oluşturucu rehberi

Araç rehberi. Güncellendi .

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.

Bir UUID v7'nin yapısıBir UUID v7 önce 48 bitlik Unix milisaniye zaman damgasını, ardından sürüm dörtlüsünü, rastgele bitleri, varyant bitlerini ve kalan rastgele bitleri saklar.48 bit: milisaniye cinsinden Unix zamanı018f3a2e-7b1c: değerleri oluşturulma zamanınagöre sıralar4 bit: sürüm (7)Üçüncü grubun ilk onaltılık basamağı12 bit: rastgeleÜçüncü grubun geri kalanı2 bit: varyant (10)Dördüncü grubun ilk onaltılık basamağı 8, 9, aya da b olur62 bit: rastgeleDeğerin geri kalanı
Bir UUID v7 önce 48 bitlik Unix milisaniye zaman damgasını, ardından sürüm dörtlüsünü, rastgele bitleri, varyant bitlerini ve kalan rastgele bitleri saklar.

UUID Oluşturucu aracı nasıl kullanılır

  1. UUID Oluşturucu aracını açın ve tanımlayıcı türünü seçin: UUID v4, UUID v7 ya da ULID.
  2. Kaç tane üretileceğini ve harflerin büyük yazılıp yazılmayacağını seçin.
  3. Oluştur düğmesine basın ve tanımlayıcıları kopyalayın.
  4. 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

Tanımlayıcı türleri
TürYapısıZamana göre sıralanırEn uygun kullanım
UUID v4122 rastgele bitHayırSıranın önemli olmadığı genel amaçlı tanımlayıcılar
UUID v748 bitlik ms zaman damgası + rastgele bitlerEvetVeritabanı birincil anahtarları, olay ve günlük kimlikleri
ULID48 bitlik ms zaman damgası + 80 rastgele bit, 26 Crockford base32 karakteriEvetURL ve dosya adlarında kısa, sıralanabilir kimlikler
UUID v1Zaman damgası + düğüm tanımlayıcısı (çoğunlukla bir MAC adresi)KısmenEski 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 / v5Bir ad alanı UUID'si ile bir adın MD5 ya da SHA-1 özetiHayırAynı 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 v7 UUID'yi ya da bir ULID'yi gören herkes, değerin ne zaman üretildiğini milisaniye hassasiyetiyle okuyabilir. Bu bilgi sizin için hassassa, örneğin URL'lerde görünen kullanıcı hesabı kimliklerinde, herkese açık tanımlayıcılar için v4 kullanın.

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.

Sürüm ve varyantın okunması
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)
Özel değerler
DeğerAnlamı
00000000-0000-0000-0000-000000000000Nil UUID, çoğunlukla "değer yok" anlamında kullanılır
ffffffff-ffff-ffff-ffff-ffffffffffffMax 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.

Yaygın ortamlarda UUID üretimi
// 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.

UUID anahtarlı bir PostgreSQL tablosu
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.

Kaynaklar