Skip to content
Bloga Dönün
Eğitimler

UUID Rehberi: Biçim, Sürümler ve Kullanım Alanları

UUID'yi sıfırdan öğrenin: 128 bitlik yapı, hex biçimi, v1/v3/v4/v5/v7 sürümlerinin iç işleyişi, çakışma matematiği, gerçek dünya kullanım alanları ve kod örnekleri.

13 dakika okuma

UUID Açıklaması: 128 Bitlik Yapı, Sürümler ve Gerçek Dünya Kullanım Alanları

Bir hizmete her kayıt olduğunuzda, hesabınız için benzersiz bir tanımlayıcı oluşturulur. Her API isteği bir trace ID taşır. Dağıtık bir veritabanındaki her satır, başka makinelerde üretilen anahtarlarla çakışmayacak bir birincil anahtara ihtiyaç duyar. Tüm bunların arkasındaki çözüm? UUID — Universally Unique Identifier (Evrensel Benzersiz Tanımlayıcı).

Bu rehber UUID’lerin ne olduğunu, nasıl yapılandırıldığını, her sürümün arka planda ne yaptığını ve ne zaman kullanmanız (veya kullanmaktan kaçınmanız) gerektiğini açıklar.

UUID’ye Bir Bakış

UUID, merkezi bir otoriteye gerek duymadan evrensel olarak benzersiz olacak şekilde tasarlanmış 128 bitlik (16 baytlık) bir tanımlayıcıdır. Kanonik 8-4-4-4-12 biçiminde 32 onaltılık (hex) basamak olarak yazılır:

550e8400-e29b-41d4-a716-446655440000
|------| |--| |--| |--| |----------|
 8 hex   4    4    4      12 hex

Yani 32 hex karakter + 4 tire = toplam 36 karakter. Tireler yalnızca biçimseldir — herhangi bir veri taşımazlar.

Temel bilgiler:

  • 128 bit = 2¹²⁸ ≈ 3,4 × 10³⁸ olası değer
  • RFC 9562 ile standartlaştırılmıştır (Mayıs 2024, RFC 4122’nin yerini alır)
  • Microsoft ekosistemlerinde GUID (Globally Unique Identifier) olarak da adlandırılır — aynı biçim, farklı isim
  • PostgreSQL (uuid türü), MySQL (BINARY(16) veya CHAR(36)) ve neredeyse her programlama dili tarafından yerel olarak desteklenir

UUID’nin Anatomisi

Her UUID, sürümünden bağımsız olarak iki üst veri alanını sabit bit konumlarında kodlar:

550e8400-e29b-41d4-a716-446655440000
                  ^  ^
                  |  |
          Version-┘  └-Variant

Sürüm Alanı (Bit 48–51)

  1. hex basamağı (üçüncü grubun ilk basamağı) UUID’nin sürümünü tanımlar:
Hex BasamakSürümYöntem
1v1Zaman damgası + MAC adresi
3v3Ad alanı + adın MD5 özeti
4v4Kriptografik olarak rastgele
5v5Ad alanı + adın SHA-1 özeti
6v6Yeniden sıralanmış zaman damgası (RFC 9562)
7v7Unix zaman damgası + rastgelelik (RFC 9562)
8v8Özel / uygulamaya özgü

Varyant Alanı (Bit 64–65)

  1. hex basamağı (dördüncü grubun ilk basamağı) varyantı tanımlar. RFC 4122/9562 UUID’leri için ilk bitler 10’dur ve bu da bu hex basamağının her zaman 8, 9, a veya b olması anlamına gelir.

Örnek Çözümleme

550e8400-e29b-41d4-a716-446655440000
              ↑         ↑
              4 → v4    a → RFC 4122 variant

This is a UUID v4 (random), RFC 4122/9562 variant.

UUID Sürümleri Açıklamalı

Sürüm 1: Zaman Damgası + MAC Adresi

UUID v1 ilk tasarımdı. Şunları kodlar:

  • 60 bitlik zaman damgası — 15 Ekim 1582’den (Gregoryen takvim reformu) bu yana 100 nanosaniyelik aralıklar
  • 14 bitlik saat dizisi — saat geriye alındığında çoğaltmaları önleyen monotonluk sayacı
  • 48 bitlik düğüm — genellikle makinenin MAC adresi
|        Timestamp         | Ver |  Clk  |Var|    Node (MAC)     |
| 60 bits                  | 4b  | 14b   |2b | 48 bits           |

Sorunlar:

  • Üretim zamanını ve donanım kimliğini açığa çıkarır (gizlilik riski)
  • MAC adresleri taklit edilebilir, bu da benzersizliği zayıflatır
  • 1582 epoch’u kafa karıştırıcıdır ve dönüştürme gerektirir

Sonuç: RFC 9562 tarafından kullanımdan kaldırıldı. Zaman tabanlı UUID’ler için bunun yerine v7 kullanın.

Sürüm 3: MD5 Ad Tabanlı (Deterministik)

UUID v3, bir ad alanı UUID’si ile bir ad karakter dizisinin özetini MD5 kullanarak hesaplar. Aynı girdiler her zaman aynı UUID’yi üretir.

import uuid
# namespace = DNS, name = "example.com"
print(uuid.uuid3(uuid.NAMESPACE_DNS, "example.com"))
# → "9073926b-929f-31c2-abc9-fad77ae3e8eb"  (always this value)

Dört standart ad alanı tanımlanmıştır:

  • DNS: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
  • URL: 6ba7b811-9dad-11d1-80b4-00c04fd430c8
  • OID: 6ba7b812-9dad-11d1-80b4-00c04fd430c8
  • X.500: 6ba7b814-9dad-11d1-80b4-00c04fd430c8

Sonuç: İşlevseldir, ancak v5’i tercih edin — SHA-1, MD5’ten daha güçlüdür.

Sürüm 4: Rastgele — En Popüler Olan

UUID v4, 122 biti kriptografik olarak güvenli rastgele verilerle doldurur (kalan 6 bit, sürüm ve varyant alanları için ayrılmıştır).

|           Random          | Ver |    Random     |Var|    Random       |
| 48 bits                   | 4b  | 12 bits       |2b | 62 bits         |

2¹²² ≈ 5,3 × 10³⁶ olası değer ile çakışma olasılığı astronomik düzeyde düşüktür. En az bir çakışma için %50 şansa ulaşmak için yaklaşık 2,71 × 10¹⁸ UUID üretmeniz gerekir — yani 2,71 kentilyon.

// Every modern browser and Node.js supports this
const id = crypto.randomUUID();
console.log(id); // → "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

Güçlü yanları: basit, gizlilik dostu, evrensel olarak desteklenir, koordinasyon gerekmez.

Zayıf yanı: veritabanı birincil anahtarı olarak kullanıldığında rastgele dağılım B-tree index parçalanmasına yol açar. Veritabanı yoğun kullanım durumları için v7’yi değerlendirin.

Sürüm 5: SHA-1 Ad Tabanlı (Deterministik)

v3 ile aynıdır ancak MD5 yerine SHA-1 kullanır. Aynı girdiler her zaman aynı UUID’yi üretir.

import uuid
print(uuid.uuid5(uuid.NAMESPACE_DNS, "example.com"))
# → "cfbff0d1-9375-5685-968c-48ce8b15ae17"  (always this value)

Kullanım alanları:

  • URL’lerden veya DNS adlarından kararlı ID’ler üretme
  • İçerik adresli depolama anahtarları
  • Yeniden üretilebilir test fixture’ları

Önemli: v3 ve v5 güvenlik için tasarlanmamıştır. Deterministiktirler — ad alanını ve adı bilen herkes UUID’yi yeniden üretebilir.

Sürüm 7: Unix Zaman Damgası + Rastgele (Yeni Projeler İçin Önerilen)

UUID v7, RFC 9562 (Mayıs 2024) ile tanıtılan en yeni sürümdür. Şunları kodlar:

  • 48 bitlik Unix zaman damgası milisaniye cinsinden — monoton olarak artan
  • 74 bit kriptografik rastgelelik
|    Unix timestamp (ms)    | Ver |  rand_a  |Var|     rand_b       |
| 48 bits                   | 4b  | 12 bits  |2b | 62 bits          |

Bu, v7 UUID’lerinin doğal olarak oluşturma zamanına göre sıralandığı anlamına gelir — daha yeni UUID’ler her zaman eskilerinden sözlük sırasına göre sonra gelir. Bu özellik, B-tree index’lerinin rastgele parçalanmak yerine sıralı kalmasını sağlayan veritabanı birincil anahtarları için v7 UUID’lerini ideal hale getirir.

import { v7 as uuidv7 } from "uuid";

const id1 = uuidv7(); // generated at T₁
const id2 = uuidv7(); // generated at T₂ (T₂ > T₁)
console.log(id1 < id2); // → true (lexicographic comparison)

Veritabanları için neden önemli: v7’nin sıralı yapısı, index sayfa bölünmelerini v4’e kıyasla %90’a kadar azaltır; bu da daha hızlı ekleme işlemleri, daha küçük index’ler ve daha iyi önbellek performansı sağlar.

UUID ile GUID — Fark Nedir?

İşlevsel açıdan hiçbir fark yoktur. GUID (Globally Unique Identifier), UUID’nin Microsoft’taki adıdır; Windows, .NET, COM ve SQL Server’da kullanılır. Biçim aynıdır: 128 bit, 8-4-4-4-12 hex.

Tek biçimsel fark: Microsoft araçları bazen GUID’leri büyük harflerle ve süslü parantezler içinde gösterir:

UUID: 550e8400-e29b-41d4-a716-446655440000
GUID: {550E8400-E29B-41D4-A716-446655440000}

Birisi “UUID ile GUID arasındaki fark” hakkında soru sorarsa, cevap şudur: marka adı.

Özel UUID Değerleri

RFC 9562, iki özel UUID tanımlar:

AdDeğerAmaç
Nil UUID00000000-0000-0000-0000-000000000000Değer yokluğunu temsil eder (null gibi)
Max UUIDffffffff-ffff-ffff-ffff-ffffffffffffSınır göstergesi veya nöbetçi değer

Bunları asla gerçek tanımlayıcı olarak kullanmayın — tanımı gereği benzersiz değiller.

Çakışma Olasılığı: Doğum Günü Problemi

“Doğum günü problemi”, bir çakışmanın olası hale gelmesi için kaç UUID üretmeniz gerektiğini hesaplar. UUID v4 için (122 rastgele bit):

Üretilen UUID SayısıÇakışma Olasılığı
1 milyon~10⁻²² (neredeyse imkânsız)
1 milyar~10⁻¹⁶ (hâlâ ihmal edilebilir)
2,71 × 10¹⁸%50 (“doğum günü sınırı”)

Bağlama oturtmak gerekirse: saniyede 1 milyar UUID üretseydiniz, tek bir çakışma için %50 şansa ulaşmak 86 yıl sürerdi. Pratikte donanım arızaları, yazılım hataları ve kozmik ışınların kopyaya yol açma olasılığı UUID v4 matematiğinden daha yüksektir.

Formül: p(n) ≈ n² / (2 × 2¹²²)

UUID Nasıl Doğrulanır

Geçerli bir UUID şu regex desenine uyar (büyük/küçük harf duyarsız):

^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$

Bu desen şunları kontrol eder:

  1. 8-4-4-4-12 hex biçimi
  2. Sürüm basamağının 1–7 aralığında olması (15. konum)
  3. Varyant nibble’ının 8, 9, a veya b ile başlaması (20. konum)
function isValidUUID(str) {
  return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);
}

isValidUUID("550e8400-e29b-41d4-a716-446655440000"); // → true
isValidUUID("not-a-uuid"); // → false

Her Dilde UUID Üretme

JavaScript / TypeScript

// Browser & Node.js — built-in v4
crypto.randomUUID();

// npm uuid package — supports v1, v3, v4, v5, v7
import { v4, v7 } from "uuid";
v4(); // random
v7(); // time-ordered

Python

import uuid

uuid.uuid4()                                    # random
uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")   # deterministic
# uuid.uuid7() planned for Python 3.14+

Go

import "github.com/google/uuid"

uuid.New()              // v4 random
uuid.Must(uuid.NewV7()) // v7 time-ordered

Java

import java.util.UUID;

UUID.randomUUID();        // v4 random
// UUID v7: use com.fasterxml.uuid or java.util.UUID in JDK 21+

SQL (PostgreSQL)

-- v4 (PostgreSQL 13+)
SELECT gen_random_uuid();

-- v7 (PostgreSQL 18+)
SELECT uuidv7();

Yaygın Kullanım Alanları

Veritabanı Birincil Anahtarları

UUID’ler, veritabanına gidip gelmeye gerek kalmadan ID’leri her yerde üretmenize olanak tanır — uygulamada, istemcide, kenarda. Bu, çevrimdışı öncelikli mimarileri mümkün kılar ve dağıtık sistemleri basitleştirir. En iyi index performansı için v7’yi, sıralama umurunuzda değilse v4’ü kullanın.

API İsteklerinin İzlenmesi

Her API isteğine giriş noktasında (gateway, yük dengeleyici) bir UUID atayın. X-Request-ID gibi bir başlıkla bunu aşağı akıştaki tüm hizmetlere geçirin. Böylece mikro hizmetler arasındaki günlükleri ilişkilendirmek son derece kolaylaşır.

Idempotency Anahtarları

API’ler, yeniden denenen isteklerin yinelenen kaynaklar oluşturmamasını sağlamak için UUID’leri idempotency anahtarı olarak kullanır. İstemci, ilk denemeden önce bir UUID üretir ve yeniden denemelerde aynı UUID’yi gönderir.

Oturum Tanımlayıcıları

UUID’ler, büyük kullanıcı tabanlarında oturum çakışmalarını önlemek için yeterli benzersizlik sağlar. Otomatik artan tamsayıların aksine sıralanarak tahmin edilemezler — bir saldırgan, bir sayıyı artırarak geçerli oturum ID’lerini tahmin edemez.

İçerik Adresli Depolama

UUID v5, içerikten deterministik ID’ler üretir. Aynı girdi için her zaman aynı UUID’yi alırsınız — yinelenenleri ayıklamada, önbelleklemede ve yeniden üretilebilir build’lerde kullanışlıdır.

Güvenlik Hususları

UUID’ler Güvenlik Tokenleri DEĞİLDİR

UUID’ler gizlilik için değil, benzersizlik için tasarlanmıştır. Temel sorunlar:

  • UUID v1, üretim zaman damgasını ve MAC adresini sızdırır
  • UUID v4’te 122 rastgele bit bulunur ancak yapısı öngörülebilirdir (sürüm/varyant bitleri sabittir)
  • UUID v3/v5 deterministiktir — ad alanını ve adı bilen herkes UUID’yi yeniden üretebilir

Güvenlik tokenleri, API anahtarları veya oturum sırları için 128+ bitlik saf rastgelelik içeren özel bir CSPRNG kullanın:

// For security tokens — NOT a UUID, but fully random
const token = Array.from(crypto.getRandomValues(new Uint8Array(32)))
  .map(b => b.toString(16).padStart(2, "0"))
  .join("");

UUID v7 Oluşturma Zamanını Açığa Çıkarır

Bir UUID v7’nin ilk 48 biti, oluşturma zaman damgasını milisaniye cinsinden kodlar. Bir v7 UUID alan herkes ne zaman oluşturulduğunu çıkarabilir:

const hex = "01906b5e-4a3e-7234-8f56-b8c12d4e5678".replace(/-/g, "").slice(0, 12);
new Date(parseInt(hex, 16));
// → 2024-07-01T12:34:56.000Z

Oluşturma zamanı hassas bir bilgiyse, bunun yerine v4 kullanın.

Sayım Önlemek İçin UUID Kullanmayın

UUID’lerin sıralı tamsayılardan tahmin edilmesi daha zor olsa da, tek erişim denetimi mekanizmanız olmamalıdır. Her zaman yetkilendirme denetimlerini uygulayın — URL belirsizliğine bel bağlamayın.

Sıkça Sorulan Sorular

UUID’lerde neden tireler var?

8-4-4-4-12 biçimindeki tireler yalnızca okunabilirliği artırmak içindir. Veri taşımazlar ve ayrıştırma sırasında yok sayılırlar. Bazı sistemler UUID’leri tiresiz olarak (32 hex karakter) saklar; bu da eşit derecede geçerlidir.

İki UUID hiç aynı olabilir mi?

Teorik olarak evet, pratikte hayır. 122 rastgele bitli UUID v4 için, herhangi bir çift için iki özdeş UUID üretme olasılığı yaklaşık 5,3 × 10³⁶’da 1’dir. Gerçek dünyadaki üretim hızlarında, bir UUID çakışmasıyla karşılaşmaktansa piyango kazanırken yıldırımın size çarpma olasılığı daha yüksektir.

UUID’ler sıralı mıdır?

Yalnızca bazı sürümler. UUID v1, v6 ve v7 zaman damgası içerir ve kronolojik olarak sıralanır. UUID v4 hiçbir sıralama olmaksızın tamamen rastgeledir. UUID v3 ve v5 deterministiktir ancak sıralı değildir.

Bir UUID ne kadar yer kaplar?

  • İkili (binary): 16 bayt (128 bit) — en verimli depolama biçimi
  • Karakter dizisi (tireli): 36 bayt (ASCII)
  • Karakter dizisi (tiresiz): 32 bayt (ASCII)

Çoğu veritabanı UUID’leri dahili olarak ikili biçimde saklar. PostgreSQL’in yerel uuid türü tam olarak 16 bayt kullanır.

Birincil anahtar için UUID mi yoksa otomatik artan mı kullanmalıyım?

Otomatik artan, tek veritabanlı uygulamalar için daha basittir (daha küçük, daha hızlı, sıralı). UUID, dağıtık sistemler için daha iyidir (her yerde üretme, koordinasyon yok, birleştirmeye uygun). UUID kullanıyorsanız, en iyi veritabanı performansı için v7’yi tercih edin.

RFC 9562 nedir?

Mayıs 2024’te yayımlanan RFC 9562, en yeni UUID standardıdır. RFC 4122’nin yerini alır ve UUID 6, 7 ile 8 sürümlerini resmi olarak tanıtır. v1’i v6/v7 lehine kullanımdan kaldırır ve nil ile max UUID değerlerini tanımlar. UUID üretimi veya doğrulaması uyguluyorsanız, RFC 9562 yetkili kaynaktır.

UUID’leri farklı programlama dilleri arasında kullanabilir miyim?

Evet. UUID biçimi (128 bit, 8-4-4-4-12 hex) dilden bağımsızdır. JavaScript’te üretilen bir UUID, Python, Go, Java veya UUID desteği olan herhangi bir başka dilde doğru şekilde ayrıştırılır. Bu birlikte çalışabilirlik, UUID’nin en büyük güçlü yanlarından biridir.


UUID Üretici ile UUID’leri anında üretin, çözümleyin ve doğrulayın — v1, v4, v5 ve v7 desteği, toplu üretim, %100 tarayıcınızda.

Bir sonraki projeniz için UUID sürümleri arasında mı seçiyorsunuz? Veritabanı kıyaslamaları ve kod örnekleri içeren pratik seçim rehberimizi okuyun: UUID v4, v7, ULID ve Snowflake karşılaştırması.