Generate UUID v4 di JavaScript โ€” Panduan Lengkap

ยทTypeScript & Full-stack DeveloperยทDitinjau olehMarcus WebbยทDiterbitkan

Gunakan UUID v4 Generator gratis langsung di browser Anda โ€” tidak perlu instalasi.

Coba UUID v4 Generator Online โ†’

Setiap aplikasi JavaScript pada akhirnya membutuhkan identifier unik โ€” token sesi, baris database, kunci idempoten untuk API pembayaran, correlation ID untuk distributed tracing. Cara paling sederhana untuk membuat UUID v4 di JavaScript saat ini adalah crypto.randomUUID(): tanpa dependensi, satu baris, aman secara kriptografis. UUID v4 banyak digunakan justru karena tidak memerlukan koordinasi antar layanan โ€” klien dan server dapat menghasilkan ID secara independen tanpa risiko tabrakan. Panduan ini mencakup API bawaan tersebut, paket npm uuid, validasi โ€” semuanya di Node.js 19+ dan browser modern. Untuk opsi tanpa kode, UUID v4 Generator di ToolDeck menghasilkan identifier yang sesuai standar secara instan.

  • โœ“crypto.randomUUID() sudah ada di browser dan Node.js โ€” tanpa dependensi, satu baris kode.
  • โœ“UUID v4 adalah identifier acak 128-bit: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y adalah 8, 9, a, atau b).
  • โœ“Validasi dengan /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i โ€” memeriksa bit versi dan varian.
  • โœ“Paket npm uuid menambahkan dukungan v1, v3, v5, dan v7 saat Anda membutuhkan lebih dari sekadar ID acak.
  • โœ“Untuk primary key database, lebih baik gunakan UUID v7 (berurutan waktu) daripada v4 (acak) untuk mengurangi fragmentasi indeks.

Apa itu UUID v4?

UUID (Universally Unique Identifier) versi 4 adalah identifier acak 128-bit yang diformat sebagai 32 digit heksadesimal yang dipisahkan oleh empat tanda hubung: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx. Angka 4 pada posisi 15 menandai versinya. Karakter y pada posisi 20 adalah salah satu dari 8, 9, a, atau b (varian RFC 4122). 122 bit sisanya bersifat acak. UUID v4 adalah versi yang paling umum dalam aplikasi JavaScript karena tidak memerlukan koordinasi antar sistem โ€” Anda dapat menghasilkan ID secara independen di klien dan server tanpa khawatir tentang tabrakan.

Before ยท javascript
After ยท javascript
// Tanpa identifier
const event = { action: "user.login", ts: 1711824000 };
// Dengan UUID v4
const event = {
  id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  action: "user.login",
  ts: 1711824000
};

crypto.randomUUID() โ€” Pendekatan JavaScript Native

crypto.randomUUID() tersedia di Chrome 92+, Firefox 95+, Safari 15.4+, dan Node.js 19+ (dengan dukungan eksperimental dari Node.js 14.17.0 melalui globalThis.crypto). Fungsi ini mengembalikan string UUID v4 36 karakter huruf kecil. Tidak perlu import di JavaScript browser. Di Node.js, Anda dapat memanggilnya langsung pada objek crypto global atau mengimportnya secara eksplisit dari modul node:crypto.

JavaScript โ€” browser (tanpa import)
// Berfungsi di browser modern mana pun โ€” tanpa build step, tanpa bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Gunakan di mana pun Anda membutuhkan identifier unik
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 โ€” dua pendekatan yang setara
// Pendekatan 1: global crypto (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Pendekatan 2: import eksplisit dari node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

Mendeteksi fitur crypto.randomUUID layak dilakukan jika kode Anda mungkin berjalan di browser lama atau WebView tertanam. Pemeriksaannya hanya berupa satu guard typeof:

JavaScript โ€” deteksi fitur dengan fallback
function generateUUIDv4() {
  // Utamakan API native jika tersedia
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // Fallback manual menggunakan getRandomValues (lihat bagian berikutnya)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Atur versi (4) dan varian (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // versi 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // varian 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"
Catatan:Dalam konteks aman (halaman HTTPS, localhost, ekstensi browser), crypto.randomUUID() selalu tersedia. Fungsi ini akan melempar error pada halaman HTTP biasa di beberapa browser. Jika aplikasi Anda pernah berjalan di HTTP biasa saat pengembangan, fallback getRandomValues di atas menangani kasus tersebut.

Membuat UUID v4 Tanpa Library

Terkadang Anda tidak dapat mengandalkan crypto.randomUUID() โ€” mungkin Anda menargetkan WebView yang menghapus API crypto, atau Anda ingin memahami apa yang terjadi di balik layar. Pendekatan manual menggunakan crypto.getRandomValues() (tersedia sejak IE 11) untuk mengisi 16 byte dengan data acak, lalu menerapkan dua operasi bitmask untuk mengatur field versi dan varian. Dua operasi inilah satu-satunya perbedaan antara UUID v4 dan string byte acak murni.

JavaScript โ€” UUID v4 manual dengan getRandomValues
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Atur versi: bit 12โ€“15 dari byte 6 = 0100 (versi 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Atur varian: bit 6โ€“7 dari byte 8 = 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"

// Verifikasi bahwa hasilnya lolos validasi UUID v4
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
Peringatan:Jangan pernah menggunakan Math.random() untuk membuat UUID. Fungsi ini tidak aman secara kriptografis, periode outputnya terlalu pendek, dan beberapa engine menghasilkan urutan yang dapat diprediksi. Selalu gunakan crypto.getRandomValues() atau crypto.randomUUID().

Paket npm uuid โ€” Dukungan Multi-Versi

Paket uuid di npm telah menjadi library UUID andalan untuk JavaScript sejak sebelum crypto.randomUUID() ada. Paket ini masih masuk akal dalam tiga situasi: Anda membutuhkan versi UUID selain v4 (v1, v3, v5, v7), Anda menargetkan runtime yang lebih lama dari Node.js 14.17.0, atau Anda ingin fungsi utilitas validate dan parse. Untuk UUID v4 biasa di runtime modern, API native sudah cukup dan saya akan melewati dependensi ini.

bash โ€” install
npm install uuid
JavaScript โ€” paket uuid untuk pembuatan v4
import { v4 as uuidv4, validate, version } from 'uuid';

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

// Validasi string UUID apa pun
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// Deteksi versi sebuah UUID
console.log(version(paymentId));     // 4

// Buat batch untuk mengisi database uji
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
Catatan:Paket uuid secara internal menggunakan crypto.getRandomValues() di browser dan crypto.randomBytes() di Node.js, sehingga sumber entropi identik dengan API native. Perbedaannya hanya fungsi utilitas tambahan dan dukungan multi-versi.

Jika Anda lebih suka tidak menulis kode sama sekali, coba UUID v4 Generator โ€” alat ini menghasilkan identifier v4 sesuai RFC 4122 langsung di browser Anda dengan satu klik.

UUID Deterministik โ€” Membuat UUID v5 dari String

UUID v4 bersifat acak secara definisi โ€” memanggilnya dua kali selalu menghasilkan hasil yang berbeda. Terkadang Anda membutuhkan kebalikannya: string input yang sama harus selalu menghasilkan UUID yang sama. Itulah yang dilakukan UUID v5. Fungsi ini melakukan hash namespace UUID dan string input dengan SHA-1, lalu memformat hasilnya sebagai UUID. Namespace yang sama + input yang sama = output yang sama, setiap saat, di setiap mesin. Ini berguna untuk menurunkan ID stabil dari URL, alamat email, atau string apa pun yang sudah mengidentifikasi sebuah resource.

JavaScript โ€” uuid v5 untuk ID deterministik
import { v5 as uuidv5 } from 'uuid';

// Namespace bawaan untuk URL (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// URL yang sama selalu menghasilkan UUID yang sama
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"

// Namespace kustom untuk aplikasi Anda
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

Catatan singkat: UUID v3 melakukan hal yang sama namun dengan MD5 alih-alih SHA-1. Lebih baik gunakan v5 untuk proyek baru. MD5 memiliki kelemahan tabrakan yang diketahui, dan meskipun itu tidak terlalu penting untuk pembuatan ID, tidak ada alasan untuk memilihnya daripada SHA-1 saat keduanya tersedia.

Referensi crypto.randomUUID() dan API Terkait

crypto.randomUUID() native tidak mengambil argumen โ€” hanya mengembalikan string. Gunakan fungsi ini saat Anda membutuhkan identifier yang sesuai RFC 4122 tanpa dependensi. Saat Anda membutuhkan byte acak mentah alih-alih string UUID terformat โ€” misalnya, untuk mengisi typed array atau menurunkan kunci โ€” gunakan crypto.getRandomValues() secara langsung. API terkait yang penting untuk pekerjaan UUID tercantum di bawah ini.

Properti / Metode
Tipe Kembalian
Deskripsi
crypto.randomUUID()
string
Mengembalikan string UUID v4 36 karakter dalam heksadesimal huruf kecil dengan tanda hubung
crypto.getRandomValues(arr)
TypedArray
Mengisi typed array dengan nilai acak yang aman secara kriptografis โ€” blok dasar untuk pembuatan UUID manual
URL.createObjectURL(blob)
string
Menghasilkan URL blob yang unik (bukan UUID, namun terkadang tertukar)

Uraian pola regex UUID v4:

Segmen
Pola
Makna
[0-9a-f]{8}
xxxxxxxx
8 digit hex pertama โ€” 32 bit acak
[0-9a-f]{4}
xxxx
4 digit hex berikutnya โ€” 16 bit acak
4[0-9a-f]{3}
4xxx
Nibble versi tetap pada 4, diikuti 12 bit acak
[89ab][0-9a-f]{3}
yxxx
Nibble varian adalah salah satu dari 8, 9, a, b โ€” diikuti 12 bit acak
[0-9a-f]{12}
xxxxxxxxxxxx
12 digit hex terakhir โ€” 48 bit acak

Validasi UUID v4 dengan Regex

Memvalidasi bahwa sebuah string adalah UUID v4 yang benar sering muncul โ€” body request API masuk, parameter URL, payload webhook. Regex buatan sendiri adalah pilihan tepat saat Anda menginginkan tanpa dependensi dan hanya memvalidasi v4. Jika Anda sudah menggunakan paket uuid, lebih baik gunakan ekspor validate() โ€” fungsi ini menangani semua versi UUID dan lebih tidak rentan kesalahan daripada mempertahankan pola kustom. Regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i memeriksa nibble versi (harus 4) dan nibble varian (harus 8, 9, a, atau b). Gunakan RegExp.prototype.test() untuk pemeriksaan boolean dan .match() saat Anda perlu mengekstrak UUID dari teks di sekitarnya.

JavaScript โ€” helper validasi UUID v4
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);
}

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

// UUID v1 โ€” nibble versi adalah 1, bukan 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

// UUID v7 โ€” nibble versi adalah 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false

// String yang salah format
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (tanpa tanda hubung)

// Ekstrak UUID dari string yang lebih besar
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"

Membuat dan Melampirkan UUID dari File dan Respons API

Dalam praktiknya, Anda jarang memanggil crypto.randomUUID() secara terpisah. Dua pola yang sering muncul: menetapkan ID ke record sebelum menulisnya ke database, dan melampirkan correlation ID ke request API keluar agar Anda dapat melacak request di berbagai layanan dalam log.

Baca File NDJSON โ†’ Tetapkan UUID โ†’ Tulis Kembali

Node.js โ€” tetapkan UUID ke record dari file
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(`Melewati baris yang salah format: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`ID ditetapkan ke ${records.length} record โ†’ ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// ID ditetapkan ke 1284 record โ†’ warehouse-products-with-ids.ndjson

Lampirkan Correlation ID ke Request API Keluar

Node.js โ€” correlation ID untuk distributed tracing
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(`Shipment API mengembalikan ${response.status}: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Pengiriman dibuat: ${result.shipment_id} (korelasi: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[korelasi:${correlationId}] Pengiriman gagal: ${err.message}`);
    throw err;
  }
}

await createShipment({
  order_id: "ord_8a3f91bc",
  destination: { city: "Jakarta", state: "DKI Jakarta", zip: "10110" },
  items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});

Pembuatan UUID dari Command-Line

Anda tidak selalu membutuhkan skrip. Node.js dapat menghasilkan UUID langsung dari command line, yang berguna untuk shell script, pipeline CI, dan pengujian ad-hoc cepat. Flag -emengevaluasi satu ekspresi.

bash โ€” buat UUID dari command line
# UUID tunggal
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Lima UUID sekaligus
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Buat dan tetapkan ke variabel shell
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# Gunakan npx uuid (jika paket terinstal secara global atau untuk keperluan sekali pakai)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash โ€” buat UUID di konsol browser (tanpa Node.js)
# Buka konsol DevTools browser mana pun dan ketik:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
Catatan:Jika Anda membutuhkan UUID dalam pipeline CI dan Node.js tidak tersedia, uuidgen sudah terinstal di macOS dan sebagian besar distro Linux. Perintah ini menghasilkan UUID v4 secara default di sistem modern.

Alternatif Performa Tinggi โ€” nanoid

Jika Anda menghasilkan ribuan ID per detik dan format UUID 36 karakter bukan persyaratan yang ketat, pertimbangkan nanoid. Kecepatan pembuatannya 2x lebih cepat daripada uuid.v4(), menghasilkan ID URL-safe 21 karakter secara default, dan berukuran sekitar 1 KB setelah minifikasi. Outputnya bukan UUID โ€” melainkan ID dengan alfabet kustom โ€” jadi jangan gunakan di mana kepatuhan RFC 4122 diperlukan (kolom UUID database, API yang memvalidasi format UUID, ID trace OpenTelemetry). Namun untuk correlation ID internal, kunci komponen React, dan slug URL, nanoid adalah pilihan yang baik.

bash โ€” install nanoid
npm install nanoid
JavaScript โ€” nanoid untuk ID unik pendek
import { nanoid, customAlphabet } from 'nanoid';

// Default: ID URL-safe 21 karakter (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"

// Panjang kustom
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"

// Alfabet kustom โ€” hanya angka, 12 digit
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Alfabet kustom โ€” hanya hex, 32 karakter (entropi sama dengan UUID v4 tanpa tanda hubung)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Output Terminal dengan Syntax Highlighting

Men-debug aplikasi yang berat UUID berarti menatap dinding string hex di terminal. Pewarnaan membantu. Library chalk (atau node:util styleText bawaan yang lebih baru di Node.js 21.7+) memungkinkan Anda menyorot UUID dalam output log agar menonjol dari teks di sekitarnya.

Node.js โ€” output UUID berwarna dengan chalk
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",...}
Peringatan:Kode escape warna merusak file log dan memecahkan parser JSON. Gunakan chalk atau styleText hanya untuk output terminal yang dibaca langsung oleh manusia. Untuk log terstruktur yang ditulis ke file atau log aggregator, gunakan JSON biasa.

Membuat ID Unik Pendek di JavaScript

UUID 36 karakter terkadang terlalu panjang โ€” slug URL, data kode QR, pesan SMS, dan protokol hardware tertanam semuanya memiliki batasan panjang.

JavaScript โ€” tiga teknik untuk ID yang lebih pendek
import { randomUUID } from 'node:crypto';

// 1. Hapus tanda hubung dari UUID v4 โ†’ string hex 32 karakter
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 karakter)

// 2. Base64-encode 16 byte acak โ†’ string 22 karakter (URL-safe)
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. nanoid dengan panjang kustom
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 karakter, ~71 bit entropi)

Perhitungan probabilitas tabrakan: nanoid 12 karakter (alfabet default 64 karakter) memberikan sekitar 71 bit entropi. Pada 1.000 ID per detik, Anda membutuhkan sekitar 116 tahun untuk mencapai probabilitas tabrakan 1%. Untuk sebagian besar aplikasi, itu lebih dari cukup. Jika Anda menghasilkan jutaan ID per hari, tetap gunakan UUID penuh atau gunakan nanoid dengan minimal 21 karakter.

UUID v7 โ€” Alternatif Berurutan Waktu untuk v4

UUID v7 (didefinisikan dalam RFC 9562) menyematkan timestamp Unix milidetik 48-bit di segmen pertama, diikuti bit acak. Hasilnya adalah UUID yang terlihat mirip v4 namun dapat diurutkan secara kronologis. Ini menjadikannya pilihan yang lebih baik daripada v4 untuk primary key database: baris baru selalu berada di akhir indeks B-tree alih-alih di posisi acak, yang mengurangi pemisahan halaman dan fragmentasi. Dalam proyek di mana saya membutuhkan ID berurutan waktu untuk tabel Postgres, saya langsung beralih ke v7 โ€” perbedaan performa indeks dapat diukur pada skala besar. UUID v7 Generator di ToolDeck menampilkan timestamp yang tertanam untuk UUID v7 apa pun.

JavaScript โ€” UUID v7 dengan paket uuid
import { v7 as uuidv7 } from 'uuid';

// Buat tiga nilai UUID v7 โ€” perhatikan urutan kronologisnya
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"

// Diurutkan secara leksikografis berdasarkan waktu pembuatan
console.log([id3, id1, id2].sort());
// [id1, id2, id3] โ€” urutan kronologis terjaga

// Gunakan v4 untuk token di mana waktu tidak boleh bocor
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // sepenuhnya acak, tanpa info waktu
Catatan:Paket uuid mendukung v7 dari versi 9.0.0 ke atas. Jika Anda menggunakan versi yang lebih lama, jalankan npm install uuid@latest untuk memperbarui.

UUID v4 di Browser Tanpa Build Step

Tanpa bundler, tanpa npm, tanpa transpiler. Hanya file HTML biasa. Ini adalah cara paling sederhana untuk membuat UUID di JavaScript sisi klien. Berfungsi karena crypto.randomUUID() adalah API browser bawaan.

HTML โ€” generator UUID browser minimal
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>UUID Generator</title></head>
<body>
  <p>UUID Anda: <strong id="output"></strong></p>
  <button onclick="document.getElementById('output').textContent = crypto.randomUUID()">
    Generate
  </button>
  <script>
    // Buat satu saat halaman dimuat
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

Itulah seluruh filenya. Tidak ada import CDN, tidak ada tag script yang menarik library. Untuk hal yang lebih kompleks โ€” pembuatan batch, validasi, ID deterministik โ€” Anda akan membutuhkan paket uuid atau fallback manual yang ditunjukkan sebelumnya. Namun untuk prototipe cepat atau alat internal, ini sudah cukup.

Kesalahan Umum

Saya telah melihat pola UUID Math.random() disalin dari postingan blog lama ke kode produksi lebih sering dari yang saya inginkan. Bug yang diperkenalkan oleh pola-pola ini bersifat diam: tidak ada error runtime, hanya perilaku yang halus salah yang muncul kemudian di bawah beban atau dalam tinjauan keamanan.

โŒ Menggunakan Math.random() untuk membuat UUID

Masalah: Math.random() tidak aman secara kriptografis. Outputnya dapat diprediksi di beberapa engine, dan entropi yang rendah membuat tabrakan jauh lebih mungkin daripada CSPRNG yang tepat.

Solusi: Selalu gunakan crypto.randomUUID() atau crypto.getRandomValues(). Keduanya menggunakan CSPRNG sistem operasi.

Before ยท JavaScript
After ยท JavaScript
// TIDAK AMAN โ€” dapat diprediksi, entropi rendah
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);
    }
  );
}
// AMAN โ€” menggunakan CSPRNG sistem operasi
const id = crypto.randomUUID();

// Atau jika Anda membutuhkan fallback manual:
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('')}`;
}
โŒ Membandingkan UUID dengan kesetaraan peka huruf besar/kecil

Masalah: crypto.randomUUID() mengembalikan hex huruf kecil, namun UUID dari sistem lain (database, API, input pengguna) mungkin menggunakan huruf besar. Perbandingan === langsung gagal ketika kasusnya berbeda.

Solusi: Normalisasi kedua sisi ke huruf kecil sebelum membandingkan.

Before ยท JavaScript
After ยท JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // huruf besar dari API
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // huruf kecil dari crypto

if (fromApi === local) { /* tidak pernah dijalankan */ }
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // cocok dengan benar
}
โŒ Menyimpan UUID sebagai objek alih-alih string

Masalah: Beberapa library UUID (terutama di bahasa lain) mengembalikan objek UUID. Di JavaScript, tanpa sengaja membungkus string UUID dalam objek merusak pemeriksaan kesetaraan, serialisasi JSON, dan query database.

Solusi: Selalu simpan dan teruskan UUID sebagai string biasa. Jika library mengembalikan objek, panggil .toString() atau akses properti string segera.

Before ยท JavaScript
After ยท JavaScript
// Membuat wrapper yang tidak perlu
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, tapi...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Cukup gunakan string
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
โŒ Memperlakukan UUID v4 sebagai dapat diurutkan

Masalah: UUID v4 sepenuhnya acak. Mengurutkan berdasarkan UUID v4 memberikan urutan arbitrari, bukan urutan pembuatan. Ini menyebabkan paginasi yang tidak dapat diprediksi, UI admin yang membingungkan, dan performa indeks database yang buruk.

Solusi: Gunakan UUID v7 saat Anda membutuhkan identifier berurutan waktu. Pertahankan UUID v4 untuk token dan correlation ID di mana urutan pengurutan tidak relevan.

Before ยท JavaScript
After ยท JavaScript
// Buruk: menggunakan v4 sebagai primary key yang dapat diurutkan
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));
// Urutan pengurutan acak โ€” BUKAN berdasarkan tanggal pembuatan
import { v7 as uuidv7 } from 'uuid';
// Baik: v7 diurutkan berdasarkan waktu pembuatan
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Urutan pengurutan sesuai waktu pembuatan

crypto.randomUUID() vs uuid vs nanoid โ€” Perbandingan Singkat

Metode
Format Output
Versi UUID
Ukuran Bundle
Tipe Kustom
Perlu Install
crypto.randomUUID()
UUID v4 36 karakter
v4 saja
0 KB
N/A
Tidak (bawaan)
paket uuid npm
UUID 36 karakter
v1, v3, v4, v5, v6, v7
~6,5 KB
N/A
npm install
nanoid
ID URL-safe 21 karakter
Kustom (bukan UUID)
~1 KB
N/A
npm install
Manual getRandomValues
UUID v4 36 karakter
v4 saja
0 KB
N/A
Tidak (bawaan)
crypto.randomBytes (Node)
Buffer โ†’ UUID v4 36 karakter
v4 saja
0 KB
N/A
Tidak (bawaan Node)
paket uuidv7 npm
UUID v7 36 karakter
v7 saja
~2 KB
N/A
npm install

Untuk sebagian besar proyek JavaScript: gunakan crypto.randomUUID() saat Anda hanya membutuhkan UUID v4 dan runtime Anda cukup baru. Gunakan paket uuid saat Anda membutuhkan dukungan v5 (deterministik) atau v7 (berurutan waktu). Gunakan nanoid saat ID pendek yang URL-safe lebih praktis daripada UUID 36 karakter โ€” tetapi ingat bahwa output nanoid tidak sesuai UUID dan akan gagal validasi pada sistem yang mengharapkan format RFC 4122.

Untuk alternatif tanpa kode, coba UUID v4 Generator untuk membuat identifier secara instan di browser. Untuk memeriksa UUID yang sudah ada, tempel ke dalam UUID Decoder untuk melihat versi, varian, dan data timestamp yang tertanam.

Pertanyaan yang Sering Diajukan

Bagaimana cara membuat UUID v4 di JavaScript?

Panggil crypto.randomUUID() di browser modern apa pun (Chrome 92+, Firefox 95+, Safari 15.4+) atau Node.js 19+. Fungsi ini mengembalikan string huruf kecil seperti "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f". Tidak perlu import di browser karena crypto adalah global bawaan; di Node.js Anda juga bisa menggunakan import { randomUUID } from "node:crypto" agar lebih eksplisit. Untuk runtime yang lebih lama dari Node.js 19, Anda masih bisa memanggil crypto.randomUUID() pada global โ€” tersedia secara eksperimental sejak Node.js 14.17.0. Jika butuh opsi tanpa kode, UUID v4 Generator di /en/uuid/v4 menghasilkan identifier yang sesuai standar dengan satu klik.

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

Apakah crypto.randomUUID() aman secara kriptografis?

Ya. crypto.randomUUID() menggunakan CSPRNG (generator angka semu yang aman secara kriptografis) yang sama dengan yang mendukung crypto.getRandomValues(). 122 bit acak dalam UUID v4 membuat probabilitas tabrakan sangat kecil untuk semua tujuan praktis โ€” Anda perlu menghasilkan sekitar 2,71 kuintiliun UUID sebelum mencapai kemungkinan 50% terjadinya satu tabrakan. Entropi berasal dari sumber acak sistem operasi (/dev/urandom di Linux, BCryptGenRandom di Windows), bukan dari Math.random() yang secara eksplisit tidak aman secara kriptografis. Ini berarti nilai UUID v4 aman digunakan sebagai token sesi, token CSRF, dan identifier sensitif keamanan lainnya di mana tidak dapat diprediksi sangat penting. Jangan pernah menggunakan generator UUID berbasis Math.random() dalam konteks keamanan.

Bisakah saya menggunakan UUID v4 sebagai primary key database?

Bisa, tetapi ada trade-off performa yang signifikan. UUID v4 sepenuhnya acak, sehingga indeks B-tree terfragmentasi buruk karena setiap baris baru dimasukkan pada posisi acak di indeks daripada di akhir. Pada tabel dengan banyak penulisan, ini menyebabkan pemisahan halaman berlebihan dan cache miss yang menurunkan performa INSERT dan range-scan. Jika database Anda mendukungnya (PostgreSQL, MySQL 8.0+, SQL Server), UUID v7 (berurutan waktu) adalah primary key yang lebih baik karena baris baru selalu ditambahkan di akhir indeks. UUID v4 tetap menjadi pilihan tepat untuk token sesi, parameter state OAuth, kunci idempoten, correlation ID, dan field apa pun di mana menyembunyikan waktu pembuatan diinginkan.

JavaScript
// UUID v4 โ€” acak, tidak bisa diurutkan
const correlationId = crypto.randomUUID();

// UUID v7 โ€” berurutan waktu, lebih baik untuk primary key DB
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

Apa perbedaan antara UUID v4 dan UUID v7?

UUID v4 mengisi 122 bit dengan data acak โ€” setiap segmen pada dasarnya adalah noise. UUID v7 (RFC 9562, diterbitkan 2024) menyandikan timestamp Unix milidetik 48-bit di segmen pertama, 12 bit presisi sub-milidetik di segmen kedua, dan bit acak di sisanya. Keduanya berukuran 128 bit dan menggunakan format 36 karakter dengan tanda hubung yang sama, sehingga dapat dipertukarkan di lapisan penyimpanan. UUID v7 dapat diurutkan secara leksikografis berdasarkan waktu pembuatan, yang membuat indeks B-tree tetap kompak dan membuat query rentang pada jendela waktu menjadi efisien. Pilih UUID v4 saat ID tidak boleh mengungkapkan kapan dibuat โ€” misalnya, token yang menghadap publik di mana informasi waktu bisa dieksploitasi โ€” dan UUID v7 untuk primary key database, log audit, dan stream event di mana urutan kronologis penting.

Bagaimana cara memvalidasi string UUID v4 di JavaScript?

Uji dengan regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i. Angka "4" literal pada posisi 15 (indeks-0) mengkonfirmasi nibble versi; karakter pada posisi 20 โ€” salah satu dari 8, 9, a, atau b โ€” menyandikan bit varian RFC 4122. Regex ini dengan benar menolak UUID v1, v7, dan string yang salah format. Flag i membuat regex tidak peka huruf besar/kecil, sehingga digit hex huruf besar dari sistem lain lolos validasi tanpa normalisasi. Jika Anda hanya perlu mengetahui apakah sebuah string adalah UUID yang valid (terlepas dari versi), gunakan pola yang lebih longgar /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.

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

Bagaimana cara membuat ID unik pendek di JavaScript?

Hapus tanda hubung dari UUID v4 untuk mendapatkan string hex 32 karakter: crypto.randomUUID().replaceAll("-", ""). Untuk sesuatu yang lebih pendek, gunakan nanoid yang menghasilkan ID URL-safe 21 karakter (Aโ€“Z, aโ€“z, 0โ€“9, _ dan -) secara default dengan resistansi tabrakan yang sebanding dengan UUID penuh. Trade-offnya mudah: ID yang lebih pendek memiliki probabilitas tabrakan yang lebih tinggi, namun nanoid dengan 21 karakter tetap menyediakan 126 bit entropi, yang lebih dari cukup untuk hampir setiap aplikasi dunia nyata. Untuk slug URL dan payload kode QR, Anda bisa memperpendek hingga 10โ€“12 karakter dengan nanoid sebelum probabilitas tabrakan menjadi perhatian pada laju pembuatan yang umum. Hindari Base64-encoding UUID mentah dan memotongnya โ€” pemotongan menghancurkan independensi statistik bit dan membuat tabrakan lebih sulit untuk dipikirkan.

JavaScript
// String hex 32 karakter dari UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// ID URL-safe 21 karakter via nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

Alat Terkait

Tersedia juga dalam: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 WebbPeninjau teknis

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.