Generate UUID v4 di JavaScript โ Panduan Lengkap
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.
// 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.
// 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));// 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:
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"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.
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)); // trueMath.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.
npm install uuid
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);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.
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.
Uraian pola regex UUID v4:
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.
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
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.ndjsonLampirkan Correlation ID ke Request API Keluar
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.
# 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
# Buka konsol DevTools browser mana pun dan ketik: crypto.randomUUID() # "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
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.
npm install nanoid
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.
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",...}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.
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.
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 waktuuuid 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.
<!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.
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.
// 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('')}`;
}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.
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
}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.
// 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"}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.
// 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 pembuatanimport { 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 pembuatancrypto.randomUUID() vs uuid vs nanoid โ Perbandingan Singkat
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.
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.
// 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.
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"); // falseBagaimana 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.
// 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
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.
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.