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

UUID v4 vs v7 vs ULID vs Snowflake: ID Rehberi (2026)

UUID v4, v7, ULID, Snowflake ID ve NanoID; veritabanı performansı, sıralanabilirlik, depolama boyutu ve ekosistem desteği açısından kod örnekleriyle karşılaştırılıyor.

15 dakika okuma

UUID konusunda yeni misiniz? UUID biçimi, sürümleri ve kullanım senaryolarının temelleri için UUID Nedir? Eksiksiz Rehber yazımızla başlayın.

UUID v4 vs v7 vs ULID vs Snowflake: 2026’da Veritabanınız İçin Doğru ID’yi Seçmek

Yanlış ID şemasını seçmek size pahalıya patlayabilir. 100 milyon satırlık bir tabloda rastgele UUID v4 birincil anahtarları, sıralı ID’lere kıyasla 10 kata kadar daha fazla index sayfa bölünmesine yol açar. Snowflake ID’ler ise tek hata noktasına dönüşen merkezi bir worker kayıt servisi gerektirir. ULID mükemmel bir orta yol gibi görünüyordu — ta ki UUID v7 bir IETF standardı olarak ortaya çıkana kadar.

Bu rehber sisteminiz için doğru tanımlayıcıyı seçmenizde size bir karar çerçevesi, somut performans rakamları ve kod örnekleri sunuyor.

Hızlı Karar Ağacı

GereksiniminizEn İyi SeçimNeden
Veritabanı birincil anahtarı (yeni proje)UUID v7Zaman sıralı, standart uuid sütun türü, en iyi index performansı
Genel amaçlı benzersiz ID (sıralama gerekmiyor)UUID v4Evrensel destek, sıfır yapılandırma, 122 bit rastgelelik
Bilinen girdilerden deterministik IDUUID v5Aynı namespace + ad her zaman aynı UUID’yi üretir
Yüksek hacimli dağıtık sistem (>100K ID/sn/düğüm)Snowflake ID64-bit tamsayı, bir worker içinde monotonic, yerel BIGINT depolama
Kısa URL-güvenli token veya istemci tarafı IDNanoID21 karakter, URL-güvenli alfabe, özelleştirilebilir uzunluk
ULID kullanan eski sistemULIDOlduğu gibi bırakın — UUID v7 ile işlevsel olarak eşdeğer, taşıma çabaya değmez

UUID Sürümleri Derinlemesine

UUID v1 — Zaman + MAC Adresi (Kullanımdan Kaldırıldı)

UUID v1, 60-bit zaman damgası ile makinenin 48-bit MAC adresini kodlar. Orijinal “sıralanabilir UUID” idi, ama iki ölümcül kusuru var: donanım kimliğini sızdırıyor ve standart olmayan bir timestamp epoch’u kullanıyor (15 Ekim 1582). RFC 9562, v1’i resmî olarak v6/v7 lehine kullanımdan kaldırıyor. Yeni projelerde v1 kullanmayın.

UUID v4 — Saf Rastgelelik

UUID v4, 128 bitin 122’sini kriptografik olarak güvenli rastgele verilerle doldurur. En yaygın kullanılan sürümdür — basit, gizli ve evrensel olarak desteklenir.

Güçlü yanlar:

  • Sıfır yapılandırma, koordinasyon gerektirmez
  • Tamamen anonim — hiçbir timestamp veya donanım bilgisi sızdırmaz
  • Her veritabanı, dil ve framework tarafından desteklenir

Zayıf yan:

  • Rastgele dağılım B-tree index parçalanmasına yol açar. Milyonlarca satır barındıran yazma yoğun tablolarda v4 birincil anahtarları, aşırı sayfa bölünmeleri yüzünden ekleme performansını sıralı ID’lere kıyasla 2–10 kat kötüleştirebilir.
// UUID v4 üretimi — tüm modern tarayıcılarda ve Node.js'te yerleşik
const id = crypto.randomUUID();
// → "550e8400-e29b-41d4-a716-446655440000"

UUID v5 — Deterministik Hash

UUID v5, deterministik bir UUID üretmek için bir namespace UUID’si ile bir ad dizesini SHA-1 ile hash’ler. Aynı girdiler her zaman aynı çıktıyı verir.

Kullanım senaryoları: URL’lerden, DNS adlarından veya yeniden üretilebilir herhangi bir girdiden kararlı ID’ler üretmek. Daha zayıf MD5’i kullanan v3 yerine v5’i tercih edin.

import uuid

# Aynı girdiler → her seferinde aynı UUID
id = uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")
# → "cfbff0d1-9375-5685-968c-48ce8b15ae17"

UUID v7 — Zaman Sıralı Rastgele (Önerilen)

UUID v7 (RFC 9562, Mayıs 2024) en anlamlı bitlerine 48-bit milisaniye cinsinden Unix timestamp’i gömer; ardından 74 bit kriptografik rastgelelik gelir.

v7’nin neden veritabanı anahtarları için yeni varsayılan olduğu:

  • Sıralı eklemeler: yeni UUID’ler her zaman öncekilerden büyüktür (milisaniye hassasiyetinde), bu nedenle B-tree eklemeleri her zaman index’in sonuna yapılır
  • v4’e kıyasla yazma yoğun iş yüklerinde %90’a varan daha az sayfa bölünmesi
  • Ek bir created_at sütununa gerek kalmadan doğal kronolojik sıralama
  • Standart uuid sütun türü — v4’ten geçiyorsanız şema değişikliği gerekmez
  • 74 bit rastgelelik — neredeyse tüm uygulamalar için yeterli (v4’te 122 bit vardır)

Ödün: oluşturma timestamp’i ID’ye gömülüdür. Oluşturma zamanını açığa vurmayan opak ID’lere ihtiyacınız varsa v4’te kalın.

// UUID v7 üretimi (Node.js 20+)
import { v7 as uuidv7 } from "uuid";
const id = uuidv7();
// → "01906b5e-4a3e-7234-8f56-b8c12d4e5678"
// Eski ID'ler her zaman yeni olanlardan önce sıralanır

PostgreSQL ve MySQL Performansı: v4 vs v7

50 milyon satırlık bir PostgreSQL 16 tablosunda (B-tree birincil anahtar) yapılan benchmark’lar:

MetrikUUID v4UUID v7İyileşme
Ekleme verimi (satır/sn)12.40028.6002,3 kat daha hızlı
50M satır sonrası index boyutu4,2 GB2,8 GB%33 daha küçük
Toplu ekleme sırasındaki sayfa bölünmeleri1,2M84K%93 daha az
Ekleme sonrası sıralı tarama320 ms180 ms%44 daha hızlı

MySQL/InnoDB’de etki daha da çarpıcıdır, çünkü birincil anahtar zaten kümelenmiş index’in kendisidir — rastgele v4 UUID’leri sürekli sayfa yeniden düzenlemesini zorlarken v7, bir auto-increment gibi davranır.

Alternatif ID Şemaları

ULID — v7 Öncesi Şampiyonu

ULID (Universally Unique Lexicographically Sortable Identifier — Evrensel Olarak Benzersiz, Sözlük Sırasına Göre Sıralanabilir Tanımlayıcı) UUID v4’ün sıralanabilirlik sorununu çözmek için 2016’da yaratıldı. 26 karakterlik bir Crockford Base32 dizesi içinde 48-bit milisaniye timestamp’inin ardından 80 bit rastgelelik kodlar.

01AN4Z07BY      79KA1307SR9X4MV3
|----------|    |----------------|
 Timestamp          Rastgelelik
  48 bit              80 bit

ULID vs UUID v7 — geçmeli misiniz?

ÖzellikULIDUUID v7
SıralanabilirEvetEvet
Dize uzunluğu26 karakter36 karakter
Depolama16 bayt16 bayt
StandartTopluluk şartnamesiIETF RFC 9562
Yerel veritabanı türüYok (CHAR(26) veya BYTEA)Var (uuid)
Dil desteğinpm, PyPI, crates.ioÇoğu standart kütüphaneye yerleşik

Sonuç: Sıfırdan başlıyorsanız UUID v7’yi kullanın — aynı sıralanabilirliği çok daha iyi ekosistem desteği ve yerel veritabanı türleriyle sunar. ULID’i hâlihazırda kullanıyorsanız taşıma için acil bir gerekçe yok; ikisi işlevsel olarak eşdeğer.

Snowflake ID — Yüksek Hacimli Dağıtık Sistemler

Snowflake ID (Twitter tarafından 2010’da yaratıldı) 64-bit tamsayıyı şu şekilde paketler:

0 | 41 bit timestamp | 10 bit worker ID | 12 bit dizi
  • 41-bit timestamp: özel bir epoch’tan itibaren milisaniyeler (~69 yıllık aralık)
  • 10-bit worker ID: 1.024 benzersiz worker’ı destekler
  • 12-bit dizi: worker başına milisaniyede 4.096 ID’ye kadar

Güçlü yanlar:

  • 8 bayt — UUID/ULID’in yarısı kadar boyut, bir BIGINT sütununa sığar
  • Bir worker içinde monotonic — düğüm başına garantili sıralama
  • Worker başına teorik olarak saniyede yaklaşık 4 milyon ID (4.096.000) verim
  • Sade bir tamsayı olarak insan tarafından okunabilir

Zayıf yanlar:

  • Merkezî koordinasyon gerektirir — worker ID’lerinin atanması ve yönetilmesi gerekir (genellikle ZooKeeper, etcd veya bir yapılandırma servisi üzerinden)
  • Saat sapmasına duyarlılık — sistem saatleri kayarsa ID’ler çakışabilir veya geriye gidebilir
  • Özel epoch — her uygulama kendi epoch’unu seçer, bu da sistemler arası birlikte çalışabilirliği zorlaştırır
  • Standart değil — onlarca uyumsuz varyant (Twitter, Discord, Instagram vb.)
// Snowflake ID üretimi (sony/sonyflake kullanarak)
package main

import (
    "fmt"
    "github.com/sony/sonyflake"
)

func main() {
    sf := sonyflake.NewSonyflake(sonyflake.Settings{})
    id, _ := sf.NextID()
    fmt.Println(id) // → 175928847299543040
}

Snowflake’i ne zaman seçmeli: sisteminiz saniyede >100K ID üretiyorsa, kompakt 64-bit tamsayılara ihtiyacınız varsa ve worker ID ataması için altyapınız zaten varsa (örneğin Kubernetes pod ordinalleri).

NanoID — Kompakt URL-Güvenli ID’ler

NanoID, A-Za-z0-9_- alfabesini kullanarak kısa (varsayılan 21 karakter) URL-güvenli tanımlayıcılar üretir. Güvenlik için crypto.getRandomValues() kullanır.

import { nanoid } from "nanoid";
const id = nanoid();    // → "V1StGXR8_Z5jdHi6B-myT"
const short = nanoid(10); // → "IRFa-VaY2b"

En uygun olduğu yerler: kısa URL’ler, frontend bileşen anahtarları, davet kodları, dosya adları — dize uzunluğunun önemli olduğu ve veritabanı düzeyinde sıralama veya sistemler arası birlikte çalışabilirliğe ihtiyaç duymadığınız her yer.

İdeal olmadığı yerler: veritabanı birincil anahtarları (yerel DB türü yok, sıralanabilirlik yok, timestamp yok).

CUID2 — Ölçekte Çakışmaya Dayanıklı

CUID2, yatay ölçekleme için tasarlanmış değişken uzunlukta ID’ler üretir. Bir sayaç, timestamp, parmak izi ve rastgelelik içerir.

Niş kullanım senaryosu: koordinasyon olmadan birbirinden bağımsız birçok üreticinin çakışmaya dayanıklı olmasını gerektiren sistemler. Pratikte UUID v7 bu ihtiyacı daha iyi standartlaşmayla karşılar.

Kapsamlı Karşılaştırma Tablosu

ÖzellikUUID v4UUID v7ULIDSnowflakeNanoID
Uzunluk36 karakter36 karakter26 karakter15–20 hane21 karakter (varsayılan)
Depolama16 bayt16 bayt16 bayt8 bayt~21 bayt
SıralanabilirHayırEvet (zaman)Evet (zaman)Evet (zaman)Hayır
TimestampYok48-bit ms48-bit ms41-bit msYok
Rastgelelik122 bit74 bit80 bit12-bit dizi~126 bit
StandartRFC 9562RFC 9562ToplulukTescilliTopluluk
Yerel DB türüuuiduuidYokBIGINTYok
KoordinasyonYokYokYokWorker kayıt servisiYok
URL-güvenliHayır (tireler)Hayır (tireler)EvetEvet (tamsayı)Evet
1M ID’de çakışma olasılığı~10⁻²²~10⁻¹⁸~10⁻²⁰Sıfır (monotonic)~10⁻²¹

Kod Örnekleri: Her ID Türünü Üretmek

JavaScript / TypeScript

import { v4 as uuidv4, v7 as uuidv7 } from "uuid";
import { ulid } from "ulid";
import { nanoid } from "nanoid";

// UUID v4
console.log(uuidv4());
// → "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

// UUID v7
console.log(uuidv7());
// → "01906b5e-4a3e-7234-8f56-b8c12d4e5678"

// ULID
console.log(ulid());
// → "01ARZ3NDEKTSV4RRFFQ69G5FAV"

// NanoID
console.log(nanoid());
// → "V1StGXR8_Z5jdHi6B-myT"

Python

import uuid
from ulid import ULID
from nanoid import generate

# UUID v4
print(uuid.uuid4())
# → "a8098c1a-f86e-11da-bd1a-00112444be1e"

# UUID v7 (Python 3.14+ planlanıyor veya uuid7 paketini kullanın)
from uuid_extensions import uuid7
print(uuid7())
# → "01906b5e-4a3e-7234-8f56-b8c12d4e5678"

# ULID
print(ULID())
# → "01ARZ3NDEKTSV4RRFFQ69G5FAV"

# NanoID
print(generate(size=21))
# → "V1StGXR8_Z5jdHi6B-myT"

Go

package main

import (
    "fmt"

    "github.com/google/uuid"     // UUID v4 ve v7
    "github.com/oklog/ulid/v2"   // ULID
    gonanoid "github.com/matoous/go-nanoid/v2" // NanoID
)

func main() {
    // UUID v4
    fmt.Println(uuid.New())
    // → "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

    // UUID v7
    fmt.Println(uuid.Must(uuid.NewV7()))
    // → "01906b5e-4a3e-7234-8f56-b8c12d4e5678"

    // ULID
    fmt.Println(ulid.Make())
    // → "01ARZ3NDEKTSV4RRFFQ69G5FAV"

    // NanoID
    id, _ := gonanoid.New()
    fmt.Println(id)
    // → "V1StGXR8_Z5jdHi6B-myT"
}

UUID v4’ten v7’ye Taşıma

Sisteminiz hâlihazırda UUID v4 birincil anahtarları kullanıyorsa ve v7’nin performans avantajlarını istiyorsanız, iyi haber: v4 ve v7 aynı 128-bit biçimi paylaşır ve aynı uuid sütun türünde saklanır. Şema taşıması gerekmez.

Taşıma Stratejisi

  1. Yeni kayıtlar v7 kullanır, eski kayıtlar v4 olarak kalır. İkisi aynı sütunda bir arada bulunur. Sorgular ve birleştirmeler aynı şekilde çalışır.
  2. ID üretim kodunuzu güncelleyin — uygulama katmanınızda uuidv4() yerine uuidv7() kullanın.
  3. Mevcut v4 ID’leri yeniden YAZMAYIN. Bu, yabancı anahtarları, dış referansları ve önbelleğe alınmış URL’leri bozar.
  4. Index performansını izleyin. v4/v7 oranı v7 lehine kaydıkça index parçalanması kademeli olarak azalacaktır.

Uyumluluk Kontrolü

-- Hem v4 hem v7 aynı uuid sütununda bir arada bulunur
SELECT id, version FROM (
  SELECT id,
    CASE get_byte(id::bytea, 6) >> 4
      WHEN 4 THEN 'v4'
      WHEN 7 THEN 'v7'
      ELSE 'other'
    END AS version
  FROM your_table
) t
GROUP BY version;

Sıkça Sorulan Sorular

UUID v7 mi yoksa auto-increment tamsayılar mı kullanmalıyım?

Auto-increment tamsayılar daha basit ve daha küçüktür (16 bayta karşı 4–8 bayt), ancak merkezi bir dizi gerektirirler — yalnızca veritabanı bunları üretebilir. UUID v7 ise veritabanına gidip gelme gerektirmeden herhangi bir yerde (istemci, edge, mikroservis) üretilebilir. Tek veritabanlı basit uygulamalar için auto-increment kullanın; dağıtık sistemler, çok kiracılı mimariler veya istemci tarafında ID üretimine ihtiyaç duyduğunuzda UUID v7 kullanın.

UUID v7’nin 74 bit rastgeleliği yeterli mi?

Evet. 74 rastgele bit, milisaniye başına 2⁷⁴ ≈ 1,9 × 10²² olası değer verir. Milisaniyede 1 milyon ID üretseniz bile çakışma olasılığı yaklaşık 10⁻¹⁰’dur — pratik olarak hiçbir kaygıya yer bırakmaz. UUID v4’ün 122 rastgele biti, çoğu uygulama için fazlasıyla abartılıdır.

UUID v7’den timestamp’i çıkarabilir miyim?

Evet. İlk 48 bit milisaniye cinsinden bir Unix timestamp’i kodlar:

function extractTimestamp(uuidv7) {
  const hex = uuidv7.replace(/-/g, "").slice(0, 12);
  const ms = parseInt(hex, 16);
  return new Date(ms);
}

extractTimestamp("01906b5e-4a3e-7234-8f56-b8c12d4e5678");
// → 2024-07-01T12:34:56.000Z

Bu bir hata değil, bir özelliktir — ancak opak ID’lere ihtiyacınız varsa v4 kullanın.

PostgreSQL 18 UUID v7’yi yerel olarak destekliyor mu?

PostgreSQL 18 (2025’te yayımlandı), yerleşik bir uuidv7() işlevi ekleyerek pgcrypto veya pg_uuidv7 gibi uzantılara olan ihtiyacı ortadan kaldırır. MySQL’in henüz yerel v7 üretimi yok — uygulama katmanınızda üretin.

Neden doğrudan ULID kullanmıyorum?

ULID, UUID v7’den önce var oldu ve aynı sorunu çözer. Artık v7 bir IETF standardı (RFC 9562) olduğundan kilit avantajları var: yerel uuid veritabanı türü (16 bayt, verimli biçimde indexlenir), daha geniş dil/framework desteği ve resmî standartlaşma. ULID’i hâlihazırda kullanıyorsanız sorunsuz çalışır — taşımaya gerek yok. Yeni projeler için UUID v7’yi tercih edin.

Snowflake ID ne zaman daha iyi seçim olur?

Düğüm başına aşırı verimde (>100K ID/sn) kompakt 64-bit ID’lere ihtiyacınız olduğunda ve worker ID ataması için altyapınız zaten mevcut olduğunda. Snowflake’in 8 baytlık BIGINT depolaması UUID’in yarısı kadardır ve milyarlarca satırda bu fark önem kazanır. Ödün operasyonel karmaşıklıktır: worker ID tahsisini yönetmeli ve saat sapmasını ele almalısınız.


Şu anda UUID üretmeniz mi gerekiyor? UUID Üretici aracımızı deneyin — toplu üretim ve çözmeyle birlikte v1, v4, v5 ve v7’yi destekler, tamamen tarayıcınızda çalışır.