JavaScript'te UUID v4 Üretme — Tam Kılavuz

·TypeScript & Full-stack Developer·İnceleyenMarcus Webb·Yayınlandı

Ücretsiz UUID v4 Üretici aracını doğrudan tarayıcınızda kullanın — kurulum gerektirmez.

UUID v4 Üretici Online Dene →

Her JavaScript uygulaması eninde sonunda benzersiz tanımlayıcılara ihtiyaç duyar — oturum belirteçleri, veritabanı satırları, ödeme API\'leri için idempotentlik anahtarları, dağıtık izleme için korelasyon kimlikleri. JavaScript\'te UUID v4 üretmenin en basit yolu bugün crypto.randomUUID(): sıfır bağımlılık, tek satır, kriptografik açıdan güvenli. UUID v4, servisler arasında koordinasyon gerektirmediği için yaygın olarak kullanılır — istemci ve sunucu, çakışma riski olmadan bağımsız olarak kimlik üretebilir. Bu kılavuz, yerleşik API\'yi, uuid npm paketini ve doğrulamayı — Node.js 19+ ve modern tarayıcılar üzerinde — kapsamaktadır. Kodsuz bir seçenek için ToolDeck\'teki UUID v4 Üreticisi anında uyumlu tanımlayıcılar üretir.

  • crypto.randomUUID() tarayıcılara ve Node.js'e yerleşiktir — sıfır bağımlılık, tek satır kod.
  • UUID v4, 128 bitlik rastgele bir tanımlayıcıdır: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y; 8, 9, a veya b'dir).
  • /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i ile doğrulayın — sürüm ve varyant bitlerini denetler.
  • uuid npm paketi, yalnızca rastgele kimlikten fazlasına ihtiyaç duyduğunuzda v1, v3, v5 ve v7 desteği ekler.
  • Veritabanı birincil anahtarları için indeks parçalanmasını azaltmak amacıyla v4 (rastgele) yerine UUID v7 (zamana göre sıralı) tercih edin.

UUID v4 Nedir?

UUID (Evrensel Benzersiz Tanımlayıcı) sürüm 4, dört tire ile ayrılmış 32 onaltılık rakamdan oluşan 128 bitlik rastgele bir tanımlayıcıdır: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. 15. konumdaki 4 sürümü işaretler. 20. konumdaki y karakteri 8, 9, a veya b\'den biridir (RFC 4122 varyantı). Kalan 122 bit rastgeledir. UUID v4, sistemler arasında koordinasyon gerektirmediğinden JavaScript uygulamalarında en yaygın kullanılan sürümdür — çakışma endişesi olmadan istemci ve sunucuda bağımsız olarak kimlik üretebilirsiniz.

Before · javascript
After · javascript
// Tanımlayıcı yok
const event = { action: "user.login", ts: 1711824000 };
// UUID v4 ile
const event = {
  id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  action: "user.login",
  ts: 1711824000
};

crypto.randomUUID() — Yerleşik JavaScript Yaklaşımı

crypto.randomUUID() Chrome 92+, Firefox 95+, Safari 15.4+ ve Node.js 19+\'da mevcuttur (Node.js 14.17.0\'dan itibaren globalThis.crypto üzerinden deneysel destek). Küçük harfli 36 karakterli UUID v4 dizesi döndürür. Tarayıcı JavaScript\'inde içe aktarma gerekmez. Node.js\'de doğrudan global crypto nesnesi üzerinden çağırabilir ya da node:crypto modülünden açıkça içe aktarabilirsiniz.

JavaScript — tarayıcı (sıfır içe aktarma)
// Herhangi bir modern tarayıcıda çalışır — derleme adımı veya paketleyici gerekmez
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Benzersiz tanımlayıcıya ihtiyaç duyduğunuz her yerde kullanın
const telemetryEvent = {
  event_id: crypto.randomUUID(),
  action: "checkout.started",
  session_id: crypto.randomUUID(),
  timestamp: Date.now(),
  cart_total_cents: 14999,
};
console.log(JSON.stringify(telemetryEvent, null, 2));
Node.js — iki eşdeğer yaklaşım
// 1. yaklaşım: global crypto (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// 2. yaklaşım: node:crypto'dan açık içe aktarma
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

Kodunuz eski tarayıcılarda veya gömülü WebView\'lerde çalışabiliyorsa crypto.randomUUID için özellik algılaması yapmaya değer. Kontrol tek bir typeof koruması:

JavaScript — geri dönüş ile özellik algılaması
function generateUUIDv4() {
  // Mümkünse yerleşik API'yi tercih et
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // getRandomValues kullanan manuel geri dönüş (sonraki bölüme bakın)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Sürüm (4) ve varyantı ayarla (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // sürüm 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // varyant 10xx

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return [
    hex.slice(0, 4).join(''),
    hex.slice(4, 6).join(''),
    hex.slice(6, 8).join(''),
    hex.slice(8, 10).join(''),
    hex.slice(10, 16).join(''),
  ].join('-');
}

console.log(generateUUIDv4());
// "9b2e4f1a-7c3d-4e8f-a5b6-0d2c1e9f8a7b"
Not:Güvenli bağlamlarda (HTTPS sayfaları, localhost, tarayıcı uzantıları), crypto.randomUUID() her zaman mevcuttur. Bazı tarayıcılarda güvensiz HTTP sayfalarında hata fırlatır. Uygulamanız geliştirme sırasında düz HTTP üzerinde çalışıyorsa, yukarıdaki getRandomValues geri dönüşü bu durumu ele alır.

Kütüphane Kullanmadan UUID v4 Üretme

Bazen crypto.randomUUID()\'e güvenemezsiniz — belki crypto API\'sini kaldıran bir WebView hedefliyorsunuzdur ya da arka planda neler olduğunu anlamak istiyorsunuzdur. Manuel yaklaşım, 16 baytı rastgele veriyle doldurmak için crypto.getRandomValues() (IE 11\'den beri mevcut) kullanır; ardından sürüm ve varyant alanlarını ayarlamak için iki bitmask işlemi uygular. Bu iki işlem, UUID v4 ile saf rastgele bayt dizisi arasındaki tek farktır.

JavaScript — getRandomValues ile manuel UUID v4
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Sürümü ayarla: bayt 6'nın 12–15. bitleri = 0100 (sürüm 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Varyantı ayarla: bayt 8'in 6–7. bitleri = 10 (RFC 4122)
  bytes[8] = (bytes[8] & 0x3f) | 0x80;

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));

  return (
    hex.slice(0, 4).join('') + '-' +
    hex.slice(4, 6).join('') + '-' +
    hex.slice(6, 8).join('') + '-' +
    hex.slice(8, 10).join('') + '-' +
    hex.slice(10, 16).join('')
  );
}

const traceId = uuidv4Manual();
console.log(traceId);
// "e4d7c2a1-3f9b-48e5-a612-9d8c7b6a5f4e"

// UUID v4 doğrulamasından geçtiğini kontrol et
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
console.log(UUID_V4_RE.test(traceId)); // true
Uyarı:UUID üretmek için Math.random() asla kullanmayın. Kriptografik açıdan güvenli değildir, çıktı periyodu çok kısadır ve bazı motorlar öngörülebilir diziler üretir. Her zaman crypto.getRandomValues() veya crypto.randomUUID() kullanın.

uuid npm Paketi — Çoklu Sürüm Desteği

npm\'deki uuid paketi, crypto.randomUUID() var olmadan önce JavaScript\'in en çok kullanılan UUID kütüphanesi olmuştur. Üç durumda hâlâ mantıklıdır: v4 dışında UUID sürümlerine (v1, v3, v5, v7) ihtiyaç duyduğunuzda, Node.js 14.17.0\'dan daha eski çalışma ortamlarını hedeflediğinizde ya da validate ve parse yardımcı işlevlerini istediğinizde. Modern bir çalışma ortamında salt UUID v4 için yerleşik API yeterlidir ve bu bağımlılıktan kaçınırdım.

bash — kurulum
npm install uuid
JavaScript — v4 üretimi için uuid paketi
import { v4 as uuidv4, validate, version } from 'uuid';

// UUID v4 üret
const paymentId = uuidv4();
console.log(paymentId);
// "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"

// Herhangi bir UUID dizesini doğrula
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// UUID sürümünü tespit et
console.log(version(paymentId));     // 4

// Test veritabanını tohumlamak için toplu üretim
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
Not:uuid paketi, tarayıcılarda dahili olarak crypto.getRandomValues() ve Node.js\'de crypto.randomBytes() kullanır; dolayısıyla entropi kaynağı yerleşik API ile aynıdır. Fark yalnızca ek yardımcı işlevler ve çoklu sürüm desteğidir.

Kod yazmak istemiyorsanız UUID v4 Üreticisi\'ni deneyin — tek tıkla doğrudan tarayıcınızda RFC 4122 uyumlu v4 tanımlayıcılar üretir.

Deterministik UUID\'ler — Bir Dizeden UUID v5 Üretme

UUID v4 tanımı gereği rastgeledir — iki kez çağırmak her zaman farklı sonuç verir. Bazen tam tersine ihtiyaç duyarsınız: aynı giriş dizesi her zaman aynı UUID\'yi üretmelidir. UUID v5 tam olarak bunu yapar. Bir isim alanı UUID\'sini ve bir giriş dizesini SHA-1 ile hash\'ler, ardından sonucu UUID olarak biçimlendirir. Aynı isim alanı + aynı giriş = her zaman, her makinede aynı çıktı. Bu, URL\'lerden, e-posta adreslerinden veya bir kaynağı zaten tanımlayan herhangi bir dizeden kararlı kimlikler türetmek için kullanışlıdır.

JavaScript — deterministik kimlikler için uuid v5
import { v5 as uuidv5 } from 'uuid';

// URL'ler için yerleşik isim alanı (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// Aynı URL her zaman aynı UUID'yi üretir
const pageId1 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
const pageId2 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
console.log(pageId1 === pageId2); // true
console.log(pageId1);
// "a6e4e1c0-7e23-5d3b-8f14-9c2a1b3d5e7f"

// Uygulamanız için özel isim alanı
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

Kısa bir not: UUID v3 aynı şeyi yapar; fark SHA-1 yerine MD5 kullanmasıdır. Yeni projeler için v5\'i tercih edin. MD5\'in bilinen çakışma zayıflıkları vardır; kimlik üretimi açısından bu pek önem taşımasa da her ikisi de mevcut olduğunda SHA-1 yerine MD5 seçmeyi gerektirecek bir neden yoktur.

crypto.randomUUID() ve İlgili API Başvurusu

Yerleşik crypto.randomUUID() hiçbir argüman almaz — yalnızca bir dize döndürür. Sıfır bağımlılıkla RFC 4122 uyumlu tanımlayıcılara ihtiyaç duyduğunuzda kullanın. Biçimlendirilmiş bir UUID dizesi yerine ham rastgele baytlara ihtiyaç duyduğunuzda — örneğin bir typed array doldurmak veya anahtar türetmek için — doğrudan crypto.getRandomValues() kullanın. UUID çalışması için önemli ilgili API\'ler aşağıda listelenmiştir.

Özellik / Metot
Dönüş Türü
Açıklama
crypto.randomUUID()
string
36 karakterli UUID v4 dizesini küçük harf onaltılık sayılar ve tireler ile döndürür
crypto.getRandomValues(arr)
TypedArray
Bir typed array'i kriptografik açıdan güvenli rastgele değerlerle doldurur — manuel UUID üretiminin temel yapı taşı
URL.createObjectURL(blob)
string
Benzersiz bir blob URL'si üretir (UUID değildir, ancak zaman zaman karıştırılır)

UUID v4 regex deseni dökümü:

Segment
Desen
Anlam
[0-9a-f]{8}
xxxxxxxx
İlk 8 onaltılık rakam — 32 rastgele bit
[0-9a-f]{4}
xxxx
Sonraki 4 onaltılık rakam — 16 rastgele bit
4[0-9a-f]{3}
4xxx
Sürüm nibble'ı 4'e sabitlenmiş, ardından 12 rastgele bit
[89ab][0-9a-f]{3}
yxxx
Varyant nibble'ı 8, 9, a veya b'den biri — ardından 12 rastgele bit
[0-9a-f]{12}
xxxxxxxxxxxx
Son 12 onaltılık rakam — 48 rastgele bit

UUID v4\'ü Regex ile Doğrulama

Bir dizenin geçerli UUID v4 olduğunu doğrulamak sürekli karşılaşılan bir durumdur — gelen API istek gövdeleri, URL parametreleri, webhook yükleri. Sıfır bağımlılık istiyorsanız ve yalnızca v4 doğruluyorsanız el yapımı regex doğru seçimdir. Zaten uuid paketini kullanıyorsanız, tüm UUID sürümlerini destekleyen ve özel deseni korumaktan daha az hata yapmaya açık validate() dışa aktarımını tercih edin. /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i regex\'i hem sürüm nibble\'ını ( 4 olmalı) hem de varyant nibble\'ını ( 8, 9, a veya b olmalı) denetler. Boolean kontroller için RegExp.prototype.test() ve çevre metinden UUID çıkarmak için .match() kullanın.

JavaScript — UUID v4 doğrulama yardımcısı
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

function isUUIDv4(str) {
  return UUID_V4_RE.test(str);
}

// Geçerli UUID v4
console.log(isUUIDv4("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d")); // true

// UUID v1 — sürüm nibble'ı 4 değil 1
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

// UUID v7 — sürüm nibble'ı 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false

// Hatalı biçimlendirilmiş dizeler
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (tireler yok)

// Daha büyük bir dizeden UUID çıkar
const logLine = 'Request req_id=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d failed with 503';
const match = logLine.match(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i);
console.log(match?.[0]);
// "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

Dosya ve API Yanıtından UUID Üretme ve Ekleme

Pratikte crypto.randomUUID()\'ü yalnız başına nadiren çağırırsınız. İki desen sürekli karşınıza çıkar: veritabanına yazmadan önce kayıtlara kimlik atamak ve günlüklerinizde bir isteği servisler arasında izleyebilmek için giden API isteklerine korelasyon kimlikleri eklemek.

NDJSON Dosyasını Oku → UUID Ata → Geri Yaz

Node.js — dosyadaki kayıtlara UUID atama
import { readFileSync, writeFileSync } from 'node:fs';
import { randomUUID } from 'node:crypto';

function assignIds(inputPath, outputPath) {
  const lines = readFileSync(inputPath, 'utf-8')
    .split('\n')
    .filter(line => line.trim());

  const records = lines.map(line => {
    try {
      const record = JSON.parse(line);
      if (!record.id) {
        record.id = randomUUID();
      }
      return JSON.stringify(record);
    } catch (err) {
      console.error(`Hatalı satır atlandı: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`${records.length} kayda ID atandı → ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// 1284 kayda ID atandı → warehouse-products-with-ids.ndjson

Giden API İsteğine Korelasyon Kimliği Ekle

Node.js — dağıtık izleme için korelasyon kimliği
import { randomUUID } from 'node:crypto';

async function createShipment(orderPayload) {
  const correlationId = randomUUID();

  try {
    const response = await fetch('https://api.logistics.dev/v2/shipments', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Correlation-ID': correlationId,
        'X-Idempotency-Key': randomUUID(),
      },
      body: JSON.stringify(orderPayload),
    });

    if (!response.ok) {
      const errorBody = await response.text();
      throw new Error(`Sevkiyat API'si ${response.status} döndürdü: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Sevkiyat oluşturuldu: ${result.shipment_id} (korelasyon: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[korelasyon:${correlationId}] Sevkiyat başarısız: ${err.message}`);
    throw err;
  }
}

await createShipment({
  order_id: "ord_8a3f91bc",
  destination: { city: "İstanbul", state: "İST", zip: "34000" },
  items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});

Komut Satırından UUID Üretme

Her zaman bir komut dosyasına ihtiyacınız yoktur. Node.js, komut satırından doğrudan UUID üretebilir; bu, kabuk komut dosyaları, CI pipeline\'ları ve hızlı geçici testler için pratiktir. -e bayrağı tek bir ifadeyi değerlendirir.

bash — komut satırından UUID üretme
# Tek UUID
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Aynı anda beş UUID
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Üret ve kabuk değişkenine ata
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# npx uuid kullan (paket global kuruluysa veya tek seferlik kullanım için)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash — tarayıcı konsolunda UUID üretme (Node.js olmadan)
# Herhangi bir tarayıcının DevTools konsolunu açın ve yazın:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Not:Bir CI pipeline\'ında UUID\'ye ihtiyaç duyuyorsanız ve Node.js mevcut değilse, uuidgen macOS ve çoğu Linux dağıtımına önceden yüklüdür. Modern sistemlerde varsayılan olarak UUID v4 üretir.

Yüksek Performanslı Alternatif — nanoid

Saniyede binlerce kimlik üretiyorsanız ve 36 karakterli UUID formatı zorunlu bir gereksinim değilse nanoid\'i değerlendirin. uuid.v4()\'ten 2 kat daha hızlıdır, varsayılan olarak 21 karakterli URL-güvenli kimlik üretir ve küçültme sonrası yaklaşık 1 KB ağırlığındadır. Çıktı bir UUID değildir — özel alfabeli bir kimlik — dolayısıyla RFC 4122 uyumluluğunun gerektiği yerlerde (veritabanı UUID sütunları, UUID formatı doğrulayan API\'ler, OpenTelemetry iz kimlikleri) kullanmayın. Ancak dahili korelasyon kimlikleri, React bileşen anahtarları ve URL slug\'ları için uygundur.

bash — nanoid kurulumu
npm install nanoid
JavaScript — kısa benzersiz kimlikler için nanoid
import { nanoid, customAlphabet } from 'nanoid';

// Varsayılan: 21 karakterli URL-güvenli kimlik (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"

// Özel uzunluk
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"

// Özel alfabe — yalnızca rakamlar, 12 basamak
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Özel alfabe — yalnızca onaltılık, 32 karakter (tiresiz UUID v4 ile aynı entropi)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Terminalde Sözdizimi Vurgulama ile Çıktı

UUID yoğun uygulamalarda hata ayıklamak, terminalde onaltılık dize duvarlarına bakmak anlamına gelir. Renk kodlaması yardımcı olur. chalk kütüphanesi (veya Node.js 21.7+\'daki daha yeni yerleşik node:util styleText), günlük çıktısında UUID\'leri çevre metinden öne çıkacak şekilde renklendirmenizi sağlar.

Node.js — chalk ile renklendirilmiş UUID çıktısı
import chalk from 'chalk';
import { randomUUID } from 'node:crypto';

function logEvent(action, metadata = {}) {
  const eventId = randomUUID();
  const timestamp = new Date().toISOString();

  console.log(
    chalk.gray(timestamp),
    chalk.cyan(eventId),
    chalk.white(action),
    Object.keys(metadata).length
      ? chalk.dim(JSON.stringify(metadata))
      : ''
  );
}

logEvent('shipment.created', { order_id: 'ord_8a3f', carrier: 'fedex' });
logEvent('payment.captured', { amount_cents: 14999, currency: 'USD' });
logEvent('webhook.delivered', { endpoint: 'https://hooks.acme.dev/orders' });
// 2026-03-27T10:15:00.000Z  a1b2c3d4-...  shipment.created  {"order_id":"ord_8a3f",...}
Uyarı:Renk kaçış kodları günlük dosyalarını bozar ve JSON ayrıştırıcıları kırar. chalk veya styleText\'i yalnızca bir insan tarafından doğrudan okunan terminal çıktısı için kullanın. Bir dosyaya veya günlük toplayıcısına giden yapılandırılmış günlükler için düz JSON kullanın.

JavaScript\'te Kısa Benzersiz Kimlik Üretme

36 karakterli UUID bazen çok uzundur — URL slug\'ları, QR kod verisi, SMS mesajları ve gömülü donanım protokollerinin hepsinin uzunluk kısıtlamaları vardır.

JavaScript — daha kısa kimlikler için üç teknik
import { randomUUID } from 'node:crypto';

// 1. UUID v4'ten tireleri çıkar → 32 karakterli onaltılık dize
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 karakter)

// 2. 16 rastgele baytı Base64 ile kodla → 22 karakterlik dize (URL-güvenli)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
  .toString('base64url')
  .replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 karakter, 128 bit entropi)

// 3. Özel uzunlukta nanoid
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 karakter, ~71 bit entropi)

Çakışma olasılığı hesabı: 12 karakterli bir nanoid (64 karakterlik varsayılan alfabe), yaklaşık 71 bit entropi sağlar. Saniyede 1.000 kimlik üretildiğinde, %1 çakışma olasılığına ulaşmak için yaklaşık 116 yıl gerekir. Çoğu uygulama için bu fazlasıyla yeterlidir. Günde milyonlarca kimlik üretiyorsanız tam UUID\'yi kullanın ya da en az 21 karakterlik nanoid tercih edin.

UUID v7 — v4\'e Zamana Göre Sıralı Alternatif

UUID v7 (RFC 9562\'de tanımlanan), ilk segmente 48 bitlik Unix milisaniye zaman damgası yerleştirir; ardından rastgele bitler gelir. Sonuç, v4\'e benzeyen ancak kronolojik sırada sıralanan bir UUID\'dir. Bu, veritabanı birincil anahtarları için v4\'ten daha iyi bir seçim yapar: yeni satırlar, rastgele konumlar yerine her zaman B-ağacı indeksinin sonuna eklenir; bu da sayfa bölünmelerini ve parçalanmayı azaltır. Postgres tablosu için zamana göre sıralı kimliklere ihtiyaç duyduğum projelerde hemen v7\'ye geçiyorum — indeks performansı farkı ölçek büyüdükçe somut biçimde hissedilir. ToolDeck\'teki UUID v7 Üreticisi herhangi bir v7 UUID için gömülü zaman damgasını gösterir.

JavaScript — uuid paketi ile UUID v7
import { v7 as uuidv7 } from 'uuid';

// Üç UUID v7 değeri üret — kronolojik sırada sıralandıklarına dikkat edin
const id1 = uuidv7();
const id2 = uuidv7();
const id3 = uuidv7();

console.log(id1);
// "018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b"
console.log(id2);
// "018e4a0c-5b40-7e34-9c2d-1e4f5a6b7c8d"
console.log(id3);
// "018e4a0c-5b41-7f56-ae3f-2a5b6c7d8e9f"

// Sözlüksel sıralamada oluşturma sırası korunur
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — kronolojik sıra korundu

// Zamanlama bilgisinin sızdırılmaması gereken belirteçler için v4 kullanın
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // tamamen rastgele, zamanlama bilgisi yok
Not:uuid paketi, v7\'yi 9.0.0 sürümünden itibaren destekler. Daha eski bir sürümdeyseniz yükseltmek için npm install uuid@latest çalıştırın.

Derleme Adımı Olmadan Tarayıcıda UUID v4

Paketleyici yok, npm yok, dönüştürücü yok. Sadece düz bir HTML dosyası. İstemci tarafı JavaScript\'te UUID üretmenin en basit yolu budur. Çalışmasının nedeni crypto.randomUUID()\'ün yerleşik bir tarayıcı API\'si olmasıdır.

HTML — minimal tarayıcı UUID üreticisi
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>UUID Generator</title></head>
<body>
  <p>Your UUID: <strong id="output"></strong></p>
  <button onclick="document.getElementById('output').textContent = crypto.randomUUID()">
    Generate
  </button>
  <script>
    // Sayfa yüklendiğinde bir tane üret
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

Dosyanın tamamı bu kadar. CDN içe aktarması yok, kütüphane yükleyen script etiketleri yok. Toplu üretim, doğrulama veya deterministik kimlikler gibi daha karmaşık işlemler için uuid paketini veya daha önce gösterilen manuel geri dönüşü kullanacaksınız. Ancak hızlı bir prototip veya dahili araç için bu kadarı yeterlidir.

Yaygın Hatalar

Math.random() UUID deseninin eski blog yazılarından prodüksiyon koduna kopyalandığını itiraf etmek istediğimden daha sık görüyorum. Bu desenlerin yarattığı hatalar sessizdir: çalışma zamanı hatası yok, yalnızca yük altında veya güvenlik incelemelerinde ortaya çıkan ince yanlış davranışlar.

UUID üretmek için Math.random() kullanmak

Sorun: Math.random() kriptografik açıdan güvenli değildir. Çıktısı bazı motorlarda tahmin edilebilirdir ve düşük entropi, uygun bir CSPRNG'ye kıyasla çakışmaları çok daha olası kılar.

Çözüm: Her zaman crypto.randomUUID() veya crypto.getRandomValues() kullanın. Her ikisi de işletim sisteminin CSPRNG'sini kullanır.

Before · JavaScript
After · JavaScript
// GÜVENSİZ — tahmin edilebilir, düşük entropi
function badUuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
    /[xy]/g,
    c => {
      const r = Math.random() * 16 | 0;
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    }
  );
}
// GÜVENLİ — işletim sistemi CSPRNG'sini kullanır
const id = crypto.randomUUID();

// Ya da manuel geri dönüşe ihtiyaç duyarsanız:
function secureUuid() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  bytes[6] = (bytes[6] & 0x0f) | 0x40;
  bytes[8] = (bytes[8] & 0x3f) | 0x80;
  const h = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return `${h.slice(0,4).join('')}-${h.slice(4,6).join('')}-${h.slice(6,8).join('')}-${h.slice(8,10).join('')}-${h.slice(10).join('')}`;
}
UUID'leri büyük/küçük harf duyarlı eşitlikle karşılaştırmak

Sorun: crypto.randomUUID() küçük harf onaltılık döndürür, ancak diğer sistemlerden (veritabanları, API'ler, kullanıcı girdisi) gelen UUID'ler büyük harf kullanabilir. Büyük/küçük harf farklıysa doğrudan === karşılaştırması başarısız olur.

Çözüm: Karşılaştırmadan önce her iki tarafı da küçük harfe normalize edin.

Before · JavaScript
After · JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // API'den büyük harfli
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // crypto'dan küçük harfli

if (fromApi === local) { /* hiçbir zaman çalışmaz */ }
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // doğru şekilde eşleşir
}
UUID'leri dize yerine nesne olarak saklamak

Sorun: Bazı UUID kütüphaneleri (özellikle diğer dillerde) UUID nesneleri döndürür. JavaScript'te bir UUID dizesini yanlışlıkla nesneye sarmak, eşitlik kontrollerini, JSON serileştirmesini ve veritabanı sorgularını bozar.

Çözüm: UUID'leri her zaman düz dize olarak saklayın ve iletin. Bir kütüphane nesne döndürüyorsa hemen .toString() çağırın veya dize özelliğine erişin.

Before · JavaScript
After · JavaScript
// Gereksiz sarıcı oluşturma
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, ama...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Sadece dize kullanın
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
UUID v4'ü sıralanabilir kabul etmek

Sorun: UUID v4 tamamen rastgeledir. UUID v4'e göre sıralamak oluşturma sırasını değil rastgele sırayı verir. Bu, öngörülemeyen sayfalama, kafa karıştırıcı yönetici arayüzleri ve kötü veritabanı indeks performansına yol açar.

Çözüm: Zamana göre sıralı tanımlayıcılara ihtiyaç duyduğunuzda UUID v7 kullanın. Sıralama sırasının önemsiz olduğu belirteçler ve korelasyon kimlikleri için UUID v4'ü saklayın.

Before · JavaScript
After · JavaScript
// Kötü: sıralanabilir birincil anahtar olarak v4 kullanmak
const rows = [
  { id: crypto.randomUUID(), created: "2026-03-27" },
  { id: crypto.randomUUID(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Sıralama rastgele — oluşturma tarihine GÖRE DEĞİL
import { v7 as uuidv7 } from 'uuid';
// İyi: v7 oluşturma zamanına göre sıralar
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Sıralama oluşturma zamanıyla örtüşür

crypto.randomUUID() vs uuid vs nanoid — Hızlı Karşılaştırma

Yöntem
Çıktı Formatı
UUID Sürümleri
Paket Boyutu
Özel Tipler
Kurulum Gerekir mi
crypto.randomUUID()
36 karakterli UUID v4
Yalnızca v4
0 KB
Yok
Hayır (yerleşik)
uuid npm paketi
36 karakterli UUID
v1, v3, v4, v5, v6, v7
~6,5 KB
Yok
npm install
nanoid
21 karakterli URL-güvenli kimlik
Özel (UUID değil)
~1 KB
Yok
npm install
Manuel getRandomValues
36 karakterli UUID v4
Yalnızca v4
0 KB
Yok
Hayır (yerleşik)
crypto.randomBytes (Node)
Buffer → 36 karakterli UUID v4
Yalnızca v4
0 KB
Yok
Hayır (Node yerleşik)
uuidv7 npm paketi
36 karakterli UUID v7
Yalnızca v7
~2 KB
Yok
npm install

Çoğu JavaScript projesi için: çalışma ortamınız yeterince güncel ve yalnızca UUID v4\'e ihtiyacınız varsa crypto.randomUUID() kullanın. v5 (deterministik) veya v7 (zamana göre sıralı) desteğine ihtiyaç duyduğunuzda uuid paketine başvurun. 36 karakterli UUID\'ye göre kısa ve URL-güvenli bir kimlik daha pratikse nanoid kullanın; ancak nanoid çıktısının UUID uyumlu olmadığını ve RFC 4122 formatı bekleyen herhangi bir sistemde doğrulamadan geçemeyeceğini unutmayın.

Kodsuz bir alternatif için tarayıcıda anında tanımlayıcı oluşturmak üzere UUID v4 Üreticisi\'ni deneyin. Mevcut bir UUID\'yi incelemek için UUID Çözücü\'ye yapıştırarak sürümünü, varyantını ve gömülü zaman damgası verilerini görün.

Sıkça Sorulan Sorular

JavaScript'te UUID v4 nasıl üretilir?

Herhangi bir modern tarayıcıda (Chrome 92+, Firefox 95+, Safari 15.4+) veya Node.js 19+'da crypto.randomUUID() çağrısı yapın. "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f" gibi küçük harfli bir dize döndürür. Tarayıcılarda herhangi bir içe aktarma gerekmez; crypto yerleşik bir global olduğundan doğrudan kullanılabilir. Node.js'de ise modülü açıkça belirtmek için import { randomUUID } from "node:crypto" ifadesini de kullanabilirsiniz. Node.js 19 öncesi sürümler için crypto.randomUUID() global üzerinden çağrılabilir — Node.js 14.17.0'dan itibaren deneysel olarak mevcuttu. Kodsuz bir seçenek arıyorsanız, /en/uuid/v4 adresindeki UUID v4 Üreticisi tek tıkla uyumlu tanımlayıcılar oluşturur.

JavaScript
const sessionId = crypto.randomUUID();
console.log(sessionId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

crypto.randomUUID() kriptografik açıdan güvenli midir?

Evet. crypto.randomUUID(), crypto.getRandomValues() ile aynı CSPRNG'yi (kriptografik açıdan güvenli sözde rastgele sayı üreticisi) kullanır. UUID v4'teki 122 rastgele bit, tüm pratik amaçlar için çakışma olasılığını ihmal edilebilir düzeyde tutar — tek bir çakışma için %50 ihtimale ulaşmak için yaklaşık 2,71 kentilyon UUID üretmeniz gerekir. Entropi, Math.random()'dan değil, işletim sisteminin rastgele kaynağından (Linux'ta /dev/urandom, Windows'ta BCryptGenRandom) gelir. Bu nedenle UUID v4 değerleri, öngörülebilirliğin önlenilmesi gereken oturum belirteçleri, CSRF belirteçleri ve diğer güvenlik açısından hassas tanımlayıcılar için güvenle kullanılabilir. Güvenlik bağlamlarında asla Math.random() tabanlı UUID üreticileri kullanmayın.

UUID v4'ü veritabanı birincil anahtarı olarak kullanabilir miyim?

Kullanabilirsiniz, ancak anlamlı bir performans ödünleşimi söz konusudur. UUID v4 tamamen rastgeledir; bu nedenle B-ağacı indeksleri kötü şekilde parçalanır; her yeni satır dizinde rastgele bir konuma eklenir. Yazma yoğun tablolarda bu, aşırı sayfa bölünmelerine ve önbellek kaçırmalarına yol açar, INSERT ve aralık tarama performansını düşürür. Veritabanınız destekliyorsa (PostgreSQL, MySQL 8.0+, SQL Server), UUID v7 (zamana göre sıralı) daha iyi bir birincil anahtar seçeneğidir; yeni satırlar her zaman indeksin sonuna eklenir. UUID v4 ise oturum belirteçleri, OAuth durum parametreleri, idempotentlik anahtarları, korelasyon kimlikleri ve oluşturma zamanının gizlenmesinin istendiği alanlar için doğru seçimdir.

JavaScript
// UUID v4 — rastgele, sıralanabilir değil
const correlationId = crypto.randomUUID();

// UUID v7 — zamana göre sıralı, DB birincil anahtarları için daha iyi
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

UUID v4 ile UUID v7 arasındaki fark nedir?

UUID v4, 122 biti rastgele veriyle doldurur — her segment esasen gürültüdür. UUID v7 (2024'te yayımlanan RFC 9562), ilk segmente 48 bitlik Unix milisaniye zaman damgası, ikinci segmente 12 bit alt milisaniye hassasiyeti ve geri kalanına rastgele bitler yerleştirir. Her ikisi de toplam 128 bittir ve aynı 36 karakterli tireli formatı kullanır; dolayısıyla depolama katmanında birbirinin yerine kullanılabilir. UUID v7, oluşturma zamanına göre sözlüksel olarak sıralanabilir; bu, B-ağacı indekslerini kompakt tutar ve zaman pencerelerine göre aralık sorgularını verimli kılar. Kimliğin ne zaman oluşturulduğunu açıklamaması gerektiğinde — örneğin zamanlama bilgisinin istismar edilebileceği herkese açık belirteçlerde — UUID v4'ü, veritabanı birincil anahtarları, denetim günlükleri ve kronolojik sıranın önemli olduğu olay akışları için ise UUID v7'yi tercih edin.

JavaScript'te bir UUID v4 dizesini nasıl doğrularım?

/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i regex'ine karşı test edin. 15. konumdaki (0 indeksli) "4" harfi sürüm nibble'ını doğrular; 20. konumdaki karakter — 8, 9, a veya b'den biri — RFC 4122 varyant bitlerini kodlar. Bu regex, UUID v1, v7 ve hatalı biçimlendirilmiş dizeleri doğru şekilde reddeder. i bayrağı büyük/küçük harf duyarsız hale getirir; böylece diğer sistemlerdeki büyük harf onaltılık rakamlar normalleştirmeye gerek kalmadan doğrulamayı geçer. Yalnızca bir dizenin geçerli bir UUID olup olmadığını (sürümden bağımsız olarak) öğrenmek istiyorsanız, daha gevşek /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i desenini kullanın.

JavaScript
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

UUID_V4_RE.test("550e8400-e29b-41d4-a716-446655440000"); // true
UUID_V4_RE.test("550e8400-e29b-11d4-a716-446655440000"); // false (v1)
UUID_V4_RE.test("not-a-uuid"); // false

JavaScript'te kısa benzersiz kimlik nasıl üretilir?

UUID v4'ten tireleri kaldırarak 32 karakterli bir onaltılık dize elde edebilirsiniz: crypto.randomUUID().replaceAll("-", ""). Daha da kısa bir şey için, varsayılan olarak tam UUID ile karşılaştırılabilir çakışma direncine sahip 21 karakterli URL-güvenli kimlik (A–Z, a–z, 0–9, _ ve -) üreten nanoid'i kullanın. Ödünleşim basittir: daha kısa kimlikler daha yüksek çakışma olasılığına sahiptir; ancak 21 karakterli nanoid hâlâ 126 bit entropi sağlar; bu da neredeyse tüm gerçek dünya uygulamaları için yeterlidir. URL slug'ları ve QR kod içerikleri için, tipik üretim hızlarında çakışma olasılığı sorun haline gelmeden önce nanoid ile 10–12 karaktere kadar inebilirsiniz. Ham bir UUID'yi Base64 ile kodlayıp kısaltmaktan kaçının — kısaltma bitlerin istatistiksel bağımsızlığını bozar ve çakışmaları tahmin etmeyi zorlaştırır.

JavaScript
// UUID v4'ten 32 karakterli onaltılık dize
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// nanoid ile 21 karakterli URL-güvenli kimlik
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

İlgili Araçlar

Şu dillerde de mevcut:Python
SL
Sophie LaurentTypeScript & Full-stack Developer

Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.

MW
Marcus WebbTeknik İnceleyici

Marcus specialises in JavaScript performance, build tooling, and the inner workings of the V8 engine. He has spent years profiling and optimising React applications, working on bundler configurations, and squeezing every millisecond out of critical rendering paths. He writes about Core Web Vitals, JavaScript memory management, and the tools developers reach for when performance really matters.