สร้าง UUID v4 ใน JavaScript
ใช้ เครื่องสร้าง UUID v4 ฟรีโดยตรงในเบราว์เซอร์ของคุณ — ไม่ต้องติดตั้ง
ลอง เครื่องสร้าง UUID v4 ออนไลน์ →แอปพลิเคชัน JavaScript ทุกตัวในที่สุดต้องการตัวระบุที่ไม่ซ้ำกัน — session token, แถวฐานข้อมูล, idempotency key สำหรับ payment API, correlation ID สำหรับ distributed tracing วิธีที่ง่ายที่สุดในการ สร้าง UUID v4 ใน JavaScript ในปัจจุบันคือ crypto.randomUUID(): ไม่ต้องพึ่งพา dependency ใด เพียงหนึ่งบรรทัด ปลอดภัยทางการเข้ารหัส UUID v4 ถูกใช้กันอย่างแพร่หลาย เพราะไม่ต้องการการประสานงานระหว่างบริการ — client และ server สามารถสร้าง ID ได้
อย่างอิสระโดยไม่ต้องกังวลเรื่องการชนกัน คู่มือนี้ครอบคลุม built-in API นั้น แพ็กเกจ uuid npm, การตรวจสอบ — ทั้งหมดบน Node.js 19+ และเบราว์เซอร์สมัยใหม่ สำหรับตัวเลือกที่ไม่ต้องเขียนโค้ด UUID v4 Generator บน ToolDeck สร้างตัวระบุที่สอดคล้องมาตรฐานได้ทันที
- ✓crypto.randomUUID() มีอยู่แล้วในเบราว์เซอร์และ Node.js — ไม่ต้องพึ่งพา dependency ใด เพียงหนึ่งบรรทัดโค้ด
- ✓UUID v4 เป็นตัวระบุสุ่ม 128 บิต: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y คือ 8, 9, a หรือ b)
- ✓ตรวจสอบด้วย /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i — ตรวจสอบบิต version และ variant
- ✓แพ็กเกจ uuid npm เพิ่มการรองรับ v1, v3, v5 และ v7 เมื่อต้องการมากกว่าแค่ random ID
- ✓สำหรับ primary key ฐานข้อมูล ควรใช้ UUID v7 (เรียงตามเวลา) แทน v4 (สุ่ม) เพื่อลดการแตกกระจายของดัชนี
UUID v4 คืออะไร?
UUID (Universally Unique Identifier) เวอร์ชัน 4 คือตัวระบุสุ่ม 128 บิตที่จัดรูปแบบเป็น เลขฐานสิบหก 32 หลักคั่นด้วยขีดกลางสี่อัน: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxตัวอักษร 4 ที่ตำแหน่ง 15 ทำเครื่องหมายเวอร์ชัน ตัวอักษร y ที่ตำแหน่ง 20 เป็นหนึ่งใน 8, 9, a, หรือ b (RFC 4122 variant) 122 บิตที่เหลือเป็นแบบสุ่ม UUID v4 เป็นเวอร์ชันที่ใช้บ่อยที่สุดในแอปพลิเคชัน JavaScript เพราะไม่ต้องการการประสานงานระหว่างระบบ — สามารถสร้าง ID อย่างอิสระบน client และ server โดยไม่ต้องกังวลเรื่องการชนกัน
// ไม่มีตัวระบุ
const event = { action: "user.login", ts: 1711824000 };// พร้อม UUID v4
const event = {
id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
action: "user.login",
ts: 1711824000
};crypto.randomUUID() — แนวทาง JavaScript แบบ Native
crypto.randomUUID() ใช้งานได้ใน Chrome 92+, Firefox 95+, Safari 15.4+ และ Node.js 19+ (พร้อมการรองรับแบบทดลอง ตั้งแต่ Node.js 14.17.0 ผ่าน globalThis.crypto) คืนค่าสตริง UUID v4 ตัวพิมพ์เล็ก 36 ตัวอักษร ไม่ต้อง import ใน JavaScript ของเบราว์เซอร์ ใน Node.js สามารถเรียกได้โดยตรงบน object crypto แบบ global หรือ import อย่างชัดเจนจากโมดูล node:crypto
// ทำงานได้ในเบราว์เซอร์สมัยใหม่ทุกตัว — ไม่ต้องมีขั้นตอน build หรือ bundler
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"
// ใช้ได้ทุกที่ที่ต้องการตัวระบุที่ไม่ซ้ำกัน
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));// แนวทางที่ 1: global crypto (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"
// แนวทางที่ 2: import อย่างชัดเจนจาก node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"การตรวจสอบ feature ของ crypto.randomUUID คุ้มค่าที่จะทำหากโค้ดอาจทำงานในเบราว์เซอร์เก่าหรือ embedded WebView การตรวจสอบ เป็นแค่การป้องกันด้วย typeof เพียงรายการเดียว:
function generateUUIDv4() {
// ใช้ native API เมื่อมีให้ใช้งาน
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
return crypto.randomUUID();
}
// fallback แบบ manual โดยใช้ getRandomValues (ดูส่วนถัดไป)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
// กำหนด version (4) และ variant (RFC 4122)
bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 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() พร้อมใช้งานเสมอ จะเกิด error บนหน้า HTTP ธรรมดาในบางเบราว์เซอร์ หากแอปพลิเคชันของคุณทำงานบน HTTP ธรรมดา ระหว่างการพัฒนา getRandomValues fallback ด้านบนจัดการกรณีนั้นได้สร้าง UUID v4 โดยไม่ต้องใช้ไลบรารี
บางครั้งคุณไม่สามารถพึ่งพา crypto.randomUUID() ได้ — บางทีคุณกำหนดเป้าหมาย WebView ที่ตัด crypto API ออก หรือคุณต้องการเข้าใจสิ่งที่เกิดขึ้นภายใต้ hood แนวทาง manual ใช้ crypto.getRandomValues() (ใช้งานได้ตั้งแต่ IE 11) เพื่อเติม 16 ไบต์ด้วยข้อมูลสุ่ม จากนั้นใช้การดำเนินการ bitmask สองครั้ง เพื่อกำหนดฟิลด์ version และ variant การดำเนินการสองอย่างนี้คือความแตกต่างเพียงอย่างเดียว ระหว่าง UUID v4 และสตริงไบต์สุ่มล้วน
function uuidv4Manual() {
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
// กำหนด version: bits 12–15 ของ byte 6 = 0100 (version 4)
bytes[6] = (bytes[6] & 0x0f) | 0x40;
// กำหนด variant: bits 6–7 ของ 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"
// ตรวจสอบว่าผ่านการตรวจสอบ 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() ในการสร้าง UUID ไม่ปลอดภัย ทางการเข้ารหัส output period สั้นเกินไป และบาง engine ผลิตลำดับที่คาดเดาได้ ใช้ crypto.getRandomValues() หรือ crypto.randomUUID() เสมอแพ็กเกจ uuid npm — การรองรับหลายเวอร์ชัน
แพ็กเกจ uuid บน npm เป็นไลบรารี UUID ยอดนิยมสำหรับ JavaScript มาตั้งแต่ก่อนที่ crypto.randomUUID() จะมีอยู่ ยังคงมีความเหมาะสมในสามสถานการณ์: ต้องการ UUID เวอร์ชันอื่นนอกจาก v4 (v1, v3, v5, v7) กำหนดเป้าหมาย runtime ที่เก่ากว่า Node.js 14.17.0 หรือต้องการฟังก์ชัน utility validate และ parse สำหรับ UUID v4 ล้วนบน runtime สมัยใหม่ native API เพียงพอและฉันจะข้าม dependency นั้น
npm install uuid
import { v4 as uuidv4, validate, version } from 'uuid';
// สร้าง UUID v4
const paymentId = uuidv4();
console.log(paymentId);
// "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"
// ตรวจสอบสตริง UUID ใดก็ได้
console.log(validate(paymentId)); // true
console.log(validate("not-a-uuid")); // false
// ตรวจจับเวอร์ชันของ UUID
console.log(version(paymentId)); // 4
// สร้างชุดสำหรับ seed ฐานข้อมูลทดสอบ
const testAccounts = Array.from({ length: 5 }, () => ({
account_id: uuidv4(),
plan: "starter",
created_at: new Date().toISOString(),
}));
console.log(testAccounts);uuid ใช้ crypto.getRandomValues() ภายในในเบราว์เซอร์ และ crypto.randomBytes() ใน Node.js ดังนั้น entropy source เหมือนกับ native API ความแตกต่างคือแค่ฟังก์ชัน utility เพิ่มเติมและการรองรับหลายเวอร์ชันหากคุณไม่ต้องการเขียนโค้ดเลย ลองใช้ UUID v4 Generator — สร้างตัวระบุ RFC 4122-compliant v4 โดยตรงในเบราว์เซอร์ของคุณด้วยคลิกเดียว
UUID เชิง Deterministic — สร้าง UUID v5 จากสตริง
UUID v4 เป็นแบบสุ่มตามนิยาม — การเรียกสองครั้งให้ผลลัพธ์ที่ต่างกันเสมอ บางครั้ง คุณต้องการสิ่งตรงข้าม: สตริง input เดียวกันควรให้ UUID เดียวกันเสมอ นั่นคือสิ่งที่ UUID v5 ทำ มัน hash namespace UUID และสตริง input ด้วย SHA-1 แล้วจัดรูปแบบผลลัพธ์เป็น UUID namespace เดียวกัน + input เดียวกัน = output เดียวกัน ทุกครั้ง ทุกเครื่อง สิ่งนี้มีประโยชน์สำหรับการสร้าง ID ที่เสถียรจาก URL, ที่อยู่อีเมล หรือสตริงใดก็ตามที่ ระบุ resource อยู่แล้ว
import { v5 as uuidv5 } from 'uuid';
// namespace ที่มีให้สำหรับ URL (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
// URL เดียวกันให้ UUID เดียวกันเสมอ
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 กำหนดเองสำหรับแอปพลิเคชันของคุณ
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"หมายเหตุสั้น ๆ: UUID v3 ทำสิ่งเดียวกันแต่ใช้ MD5 แทน SHA-1 ควรใช้ v5 สำหรับโปรเจกต์ใหม่ MD5 มีจุดอ่อนด้านการชนกันที่ทราบกัน แม้ว่าจะไม่สำคัญมากสำหรับการสร้าง ID แต่ไม่มีเหตุผล ที่จะเลือกมันมากกว่า SHA-1 เมื่อทั้งคู่ใช้งานได้
เอกสารอ้างอิง crypto.randomUUID() และ API ที่เกี่ยวข้อง
crypto.randomUUID() แบบ native ไม่รับ argument — คืนค่าสตริงและไม่มีอะไรอื่น ใช้เมื่อต้องการตัวระบุที่สอดคล้อง RFC 4122 โดยไม่มี dependency ใด เมื่อต้องการ raw random byte แทนสตริง UUID ที่จัดรูปแบบแล้ว — เช่น เพื่อเติม typed array หรือ derive key — ใช้ crypto.getRandomValues() โดยตรง API ที่เกี่ยวข้องที่สำคัญสำหรับงาน UUID แสดงไว้ด้านล่าง
รายละเอียด regex pattern ของ UUID v4:
ตรวจสอบ UUID v4 ด้วย Regex
การตรวจสอบว่าสตริงเป็น UUID v4 ที่ถูกต้องเกิดขึ้นอยู่เสมอ — body ของ API request ขาเข้า, URL parameter, webhook payload การสร้าง regex เองเป็นทางเลือกที่ถูกต้องเมื่อ ต้องการ zero dependency และตรวจสอบแค่ v4 หากใช้แพ็กเกจ uuid อยู่แล้ว ควรใช้ฟังก์ชัน validate() แทน — รองรับ UUID ทุกเวอร์ชันและไม่ค่อยเกิดข้อผิดพลาดเท่ากับการดูแล pattern กำหนดเอง regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i ตรวจสอบทั้ง version nibble (ต้องเป็น 4) และ variant nibble (ต้องเป็น 8, 9, a, หรือ b) ใช้ RegExp.prototype.test() สำหรับการตรวจสอบแบบ boolean และ .match() เมื่อต้องการดึง UUID จากข้อความโดยรอบ
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 ที่ถูกต้อง
console.log(isUUIDv4("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d")); // true
// UUID v1 — version nibble เป็น 1 ไม่ใช่ 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false
// UUID v7 — version nibble เป็น 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false
// สตริงที่ผิดรูปแบบ
console.log(isUUIDv4("not-a-uuid")); // false
console.log(isUUIDv4("")); // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (ไม่มีขีดกลาง)
// ดึง UUID จากสตริงที่ใหญ่กว่า
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"สร้างและแนบ UUID จากไฟล์และการตอบกลับ API
ในทางปฏิบัติ คุณไม่ค่อยเรียก crypto.randomUUID() แบบแยกเดี่ยว สองรูปแบบที่เกิดขึ้นบ่อย: การกำหนด ID ให้กับ record ก่อนเขียนลงฐานข้อมูล และการแนบ correlation ID กับ API request ขาออกเพื่อให้สามารถติดตาม request ข้ามบริการ ใน log ของคุณได้
อ่านไฟล์ NDJSON → กำหนด UUID → เขียนกลับ
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(`ข้ามบรรทัดที่ผิดรูปแบบ: ${err.message}`);
return null;
}
}).filter(Boolean);
writeFileSync(outputPath, records.join('\n') + '\n');
console.log(`กำหนด ID ให้กับ ${records.length} record → ${outputPath}`);
}
assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// กำหนด ID ให้กับ 1284 record → warehouse-products-with-ids.ndjsonแนบ Correlation ID กับ API Request ขาออก
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 returned ${response.status}: ${errorBody}`);
}
const result = await response.json();
console.log(`สร้าง shipment แล้ว: ${result.shipment_id} (correlation: ${correlationId})`);
return result;
} catch (err) {
console.error(`[correlation:${correlationId}] Shipment ล้มเหลว: ${err.message}`);
throw err;
}
}
await createShipment({
order_id: "ord_8a3f91bc",
destination: { city: "กรุงเทพฯ", state: "กทม.", zip: "10110" },
items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});การสร้าง UUID จาก Command Line
คุณไม่จำเป็นต้องมีสคริปต์เสมอไป Node.js สามารถสร้าง UUID โดยตรงจาก command line ซึ่งสะดวกสำหรับ shell script, CI pipeline และการทดสอบเฉพาะกิจ flag -e ประเมิน expression เดียว
# UUID เดียว node -e "console.log(crypto.randomUUID())" # 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f # UUID ห้าตัวพร้อมกัน node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())" # สร้างและกำหนดให้กับตัวแปร shell export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())") echo "Request ID: $REQUEST_ID" # ใช้ npx uuid (หากติดตั้งแพ็กเกจ globally หรือต้องการแบบครั้งเดียว) npx uuid v4 # 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
# เปิด DevTools console ของเบราว์เซอร์ใดก็ได้แล้วพิมพ์: crypto.randomUUID() # "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
uuidgen ติดตั้งไว้แล้วใน macOS และ Linux distribution ส่วนใหญ่ สร้าง UUID v4 ตามค่าเริ่มต้นบนระบบสมัยใหม่ทางเลือกประสิทธิภาพสูง — nanoid
หากคุณสร้าง ID หลายพันตัวต่อวินาทีและรูปแบบ UUID 36 ตัวอักษรไม่ใช่ข้อกำหนดที่แน่นอน ลองพิจารณา nanoidเร็วกว่า uuid.v4() ถึง 2 เท่า สร้าง ID URL-safe 21 ตัวอักษรตามค่าเริ่มต้น และมีน้ำหนักประมาณ 1 KB หลัง minification output ไม่ใช่ UUID — เป็น ID alphabet กำหนดเอง — ดังนั้นอย่าใช้ที่ต้องการ RFC 4122 compliance (คอลัมน์ UUID ของฐานข้อมูล, API ที่ตรวจสอบรูปแบบ UUID, OpenTelemetry trace ID) แต่สำหรับ correlation ID ภายใน, React component key และ URL slug เหมาะสมมาก
npm install nanoid
import { nanoid, customAlphabet } from 'nanoid';
// ค่าเริ่มต้น: ID URL-safe 21 ตัวอักษร (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"
// ความยาวกำหนดเอง
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"
// alphabet กำหนดเอง — ตัวเลขเท่านั้น 12 หลัก
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"
// alphabet กำหนดเอง — ฐานสิบหกเท่านั้น 32 ตัวอักษร (entropy เดียวกับ UUID v4 ไม่มีขีดกลาง)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"Terminal Output พร้อม Syntax Highlighting
การ debug แอปพลิเคชันที่ใช้ UUID จำนวนมากหมายถึงการจ้องมองกำแพงสตริงฐานสิบหกใน terminal การใส่สีช่วยได้ ไลบรารี chalk (หรือ node:util styleText แบบ built-in ใหม่ใน Node.js 21.7+) ให้คุณ highlight UUID ใน log output เพื่อให้โดดเด่นจากข้อความโดยรอบ
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",...}สร้าง ID ที่สั้นและไม่ซ้ำกันใน JavaScript
UUID 36 ตัวอักษรบางครั้งยาวเกินไป — URL slug, ข้อมูล QR code, SMS และ โปรโตคอล hardware แบบ embedded ทั้งหมดมีข้อจำกัดด้านความยาว
import { randomUUID } from 'node:crypto';
// 1. ตัดขีดกลางจาก UUID v4 → สตริงฐานสิบหก 32 ตัวอักษร
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 ตัวอักษร)
// 2. Base64 encode 16 random byte → สตริง 22 ตัวอักษร (URL-safe)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
.toString('base64url')
.replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 ตัวอักษร, 128 บิต entropy)
// 3. nanoid ที่ความยาวกำหนดเอง
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 ตัวอักษร, ~71 บิต entropy)การคำนวณความน่าจะเป็นการชนกัน: nanoid 12 ตัวอักษร (alphabet เริ่มต้น 64 ตัวอักษร) ให้ประมาณ 71 บิตของ entropy ที่ 1,000 ID ต่อวินาที คุณต้องใช้เวลาประมาณ 116 ปี เพื่อถึงความน่าจะเป็นการชนกัน 1% สำหรับแอปพลิเคชันส่วนใหญ่นั้นมากกว่าพอ หากคุณ สร้าง ID หลายล้านตัวต่อวัน ให้ใช้ UUID เต็มรูปแบบหรือ nanoid ที่มีอย่างน้อย 21 ตัวอักษร
UUID v7 — ทางเลือกเรียงตามเวลาแทน v4
UUID v7 (กำหนดใน RFC 9562) ฝัง Unix millisecond timestamp 48 บิตในส่วนแรก ตามด้วยบิตสุ่ม ผลลัพธ์คือ UUID ที่ดูคล้ายกับ v4 แต่เรียงตามลำดับเวลา สิ่งนี้ทำให้เป็นทางเลือกที่ดีกว่า v4 สำหรับ primary key ฐานข้อมูล: แถวใหม่จะอยู่ท้าย B-tree index เสมอแทนที่จะอยู่ในตำแหน่งสุ่ม ซึ่งลด page split และการแตกกระจาย ในโปรเจกต์ที่ต้องการ ID เรียงตามเวลา สำหรับตาราง Postgres ฉันเปลี่ยนเป็น v7 ทันที — ความแตกต่างประสิทธิภาพของ index วัดได้เมื่อมีขนาดใหญ่ UUID v7 Generator บน ToolDeck แสดง timestamp ที่ฝังอยู่สำหรับ UUID v7 ใดก็ได้
import { v7 as uuidv7 } from 'uuid';
// สร้างค่า UUID v7 สาม — สังเกตว่าเรียงตามลำดับเวลา
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"
// เรียงตาม lexicographic ตามเวลาสร้าง
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — ลำดับตามเวลายังคงอยู่
// ใช้ v4 สำหรับ token ที่ไม่ควรเปิดเผยข้อมูลเวลา
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // สุ่มอย่างสมบูรณ์ ไม่มีข้อมูลเวลาuuid รองรับ v7 ตั้งแต่เวอร์ชัน 9.0.0 เป็นต้นไป หากใช้เวอร์ชันเก่ากว่า รัน npm install uuid@latest เพื่ออัปเกรดUUID v4 ในเบราว์เซอร์โดยไม่ต้องมี Build Step
ไม่มี bundler ไม่มี npm ไม่มี transpiler แค่ไฟล์ HTML ธรรมดา นี่คือวิธีที่ง่ายที่สุด ในการสร้าง UUID ใน client-side JavaScript ทำงานได้เพราะ crypto.randomUUID() เป็น built-in browser API
<!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>
// สร้างหนึ่งตัวเมื่อโหลดหน้า
document.getElementById('output').textContent = crypto.randomUUID();
</script>
</body>
</html>นั่นคือไฟล์ทั้งหมด ไม่มี CDN import ไม่มี script tag ดึง library สำหรับสิ่งที่ซับซ้อนกว่า — การสร้างแบบ batch, การตรวจสอบ, ID เชิง deterministic — คุณจะต้องการแพ็กเกจ uuid หรือ manual fallback ที่แสดงก่อนหน้า แต่สำหรับ prototype หรือเครื่องมือภายใน นี่คือทุกสิ่งที่คุณต้องการ
ข้อผิดพลาดที่พบบ่อย
ฉันเคยเห็น pattern UUID ที่ใช้ Math.random() ถูกคัดลอกจากบล็อกโพสต์เก่า ๆ เข้าไปในโค้ด production บ่อยกว่าที่อยากจะยอมรับ บัคที่ pattern เหล่านี้สร้างขึ้นเป็นแบบเงียบ: ไม่มี runtime error แค่พฤติกรรมที่ผิดเล็กน้อย ที่ปรากฎออกมาในภายหลังภายใต้ load หรือในการตรวจสอบความปลอดภัย
ปัญหา: Math.random() ไม่ปลอดภัยทางการเข้ารหัส output ของมันคาดเดาได้ใน engine บางตัว และ entropy ต่ำทำให้การชนกันน่าจะเป็นมากกว่า CSPRNG ที่เหมาะสมมาก
วิธีแก้: ใช้ crypto.randomUUID() หรือ crypto.getRandomValues() เสมอ ทั้งคู่ใช้ CSPRNG ของระบบปฏิบัติการ
// ไม่ปลอดภัย — คาดเดาได้, entropy ต่ำ
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);
}
);
}// ปลอดภัย — ใช้ OS CSPRNG
const id = crypto.randomUUID();
// หรือหากต้องการ manual fallback:
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('')}`;
}ปัญหา: crypto.randomUUID() คืนค่าฐานสิบหกพิมพ์เล็ก แต่ UUID จากระบบอื่น (ฐานข้อมูล, API, user input) อาจใช้พิมพ์ใหญ่ การเปรียบเทียบ === โดยตรงล้มเหลวเมื่อ case ต่างกัน
วิธีแก้: ทำ normalize ทั้งสองฝั่งเป็นพิมพ์เล็กก่อนเปรียบเทียบ
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // พิมพ์ใหญ่จาก API
const local = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"; // พิมพ์เล็กจาก crypto
if (fromApi === local) { /* ไม่รันเลย */ }const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";
if (fromApi.toLowerCase() === local.toLowerCase()) {
// ตรงกันอย่างถูกต้อง
}ปัญหา: ไลบรารี UUID บางตัว (โดยเฉพาะในภาษาอื่น) คืนค่า UUID object ใน JavaScript การห่อ UUID string ใน object โดยไม่ตั้งใจทำลายการตรวจสอบความเท่ากัน, JSON serialization และ database query
วิธีแก้: เก็บและส่ง UUID เป็น plain string เสมอ หากไลบรารีคืนค่า object ให้เรียก .toString() หรือเข้าถึง string property ทันที
// สร้าง wrapper ที่ไม่จำเป็น
class UUID {
constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true แต่...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}// แค่ใช้ string
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}ปัญหา: UUID v4 เป็นแบบสุ่มอย่างสมบูรณ์ การเรียงตาม UUID v4 ให้ลำดับที่ไม่แน่นอน ไม่ใช่ลำดับการสร้าง สิ่งนี้นำไปสู่ pagination ที่คาดเดาไม่ได้, UI ที่สับสน และประสิทธิภาพ index ฐานข้อมูลที่แย่
วิธีแก้: ใช้ UUID v7 เมื่อต้องการตัวระบุที่เรียงตามเวลา คง UUID v4 สำหรับ token และ correlation ID ที่ลำดับการเรียงไม่เกี่ยวข้อง
// ไม่ดี: ใช้ v4 เป็น sortable primary key
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));
// ลำดับการเรียงเป็นแบบสุ่ม — ไม่ใช่ตามวันที่สร้างimport { v7 as uuidv7 } from 'uuid';
// ดี: v7 เรียงตามเวลาสร้าง
const rows = [
{ id: uuidv7(), created: "2026-03-27" },
{ id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// ลำดับการเรียงตรงกับเวลาสร้างcrypto.randomUUID() vs uuid vs nanoid — การเปรียบเทียบอย่างรวดเร็ว
สำหรับโปรเจกต์ JavaScript ส่วนใหญ่: ใช้ crypto.randomUUID() เมื่อต้องการแค่ UUID v4 และ runtime ใหม่พอ เลือกใช้แพ็กเกจ uuid เมื่อต้องการการรองรับ v5 (deterministic) หรือ v7 (time-ordered) ใช้ nanoid เมื่อ ID ที่สั้นและ URL-safe ใช้งานได้จริงมากกว่า UUID 36 ตัวอักษร — แต่จำไว้ว่า output ของ nanoid ไม่สอดคล้องกับ UUID และจะผ่านการตรวจสอบล้มเหลวในระบบใดก็ตามที่คาดหวัง รูปแบบ RFC 4122
สำหรับทางเลือกที่ไม่ต้องเขียนโค้ด ลองใช้ UUID v4 Generator เพื่อสร้างตัวระบุทันทีในเบราว์เซอร์ หากต้องการตรวจสอบ UUID ที่มีอยู่ วางลงใน UUID Decoder เพื่อดูเวอร์ชัน ตัวแปร และข้อมูล timestamp ที่ฝังอยู่
คำถามที่พบบ่อย
จะสร้าง UUID v4 ใน JavaScript ได้อย่างไร?
เรียกใช้ crypto.randomUUID() ในเบราว์เซอร์สมัยใหม่ (Chrome 92+, Firefox 95+, Safari 15.4+) หรือ Node.js 19+ จะได้รับสตริงพิมพ์เล็กในรูปแบบ "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f" ไม่ต้อง import ในเบราว์เซอร์เพราะ crypto เป็น global ที่มีอยู่แล้ว ใน Node.js สามารถเรียกใช้ได้โดยตรงหรือ import จาก "node:crypto" อย่างชัดเจน สำหรับ runtime ที่เก่ากว่า Node.js 19 ยังสามารถเรียก crypto.randomUUID() บน global ได้ — มีให้ใช้งานแบบทดลองตั้งแต่ Node.js 14.17.0 หากต้องการตัวเลือกที่ไม่ต้องเขียนโค้ด เครื่องมือ UUID v4 Generator ที่ /en/uuid/v4 สร้างตัวระบุที่สอดคล้องมาตรฐานได้ในคลิกเดียว
const sessionId = crypto.randomUUID(); console.log(sessionId); // "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"
crypto.randomUUID() ปลอดภัยทางการเข้ารหัสหรือไม่?
ใช่ crypto.randomUUID() ใช้ CSPRNG (pseudorandom number generator ที่ปลอดภัยทางการเข้ารหัส) เดียวกับที่ใช้ใน crypto.getRandomValues() 122 บิตสุ่มใน UUID v4 ทำให้ความน่าจะเป็นของการชนกันน้อยมากในทางปฏิบัติ — คุณต้องสร้าง UUID ประมาณ 2.71 quintillion ตัวจึงจะมีโอกาส 50% ที่จะเกิดการชนกันครั้งเดียว ค่า entropy มาจากแหล่งสุ่มของระบบปฏิบัติการ (/dev/urandom บน Linux, BCryptGenRandom บน Windows) ไม่ได้มาจาก Math.random() ซึ่งไม่ปลอดภัยทางการเข้ารหัสอย่างชัดเจน ซึ่งหมายความว่าค่า UUID v4 ปลอดภัยที่จะใช้เป็น session token, CSRF token และตัวระบุที่ต้องการความปลอดภัยอื่น ๆ อย่าใช้ UUID generator ที่ใช้ Math.random() ในบริบทที่เกี่ยวข้องกับความปลอดภัย
สามารถใช้ UUID v4 เป็น primary key ของฐานข้อมูลได้หรือไม่?
ได้ แต่มีการแลกเปลี่ยนประสิทธิภาพที่สำคัญ UUID v4 เป็นแบบสุ่มอย่างสมบูรณ์ ดังนั้น B-tree index จะแตกกระจายได้ง่ายเพราะแต่ละแถวใหม่แทรกที่ตำแหน่งสุ่มในดัชนีแทนที่จะเป็นท้าย บนตารางที่มีการเขียนมาก สิ่งนี้ทำให้เกิด page split มากเกินไปและ cache miss ซึ่งลดประสิทธิภาพของ INSERT และการสแกนช่วง หากฐานข้อมูลของคุณรองรับ (PostgreSQL, MySQL 8.0+, SQL Server) UUID v7 (เรียงตามเวลา) เป็น primary key ที่ดีกว่าเพราะแถวใหม่จะเพิ่มที่ท้าย index เสมอ UUID v4 ยังคงเป็นตัวเลือกที่ถูกต้องสำหรับ session token, OAuth state parameter, idempotency key, correlation ID และฟิลด์ใดก็ตามที่ต้องการซ่อนเวลาสร้าง
// UUID v4 — สุ่ม ไม่สามารถเรียงลำดับได้
const correlationId = crypto.randomUUID();
// UUID v7 — เรียงตามเวลา เหมาะสำหรับ DB primary key
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();UUID v4 และ UUID v7 ต่างกันอย่างไร?
UUID v4 เติม 122 บิตด้วยข้อมูลสุ่ม — ทุกส่วนเป็น noise อย่างมีประสิทธิภาพ UUID v7 (RFC 9562 เผยแพร่ปี 2024) เข้ารหัส timestamp Unix millisecond 48 บิตในส่วนแรก ความละเอียด sub-millisecond 12 บิตในส่วนที่สอง และบิตสุ่มในส่วนที่เหลือ ทั้งคู่มีขนาด 128 บิตและใช้รูปแบบ 36 ตัวอักษรพร้อมขีดกลางเหมือนกัน ดังนั้นสามารถใช้แทนกันได้ที่ระดับพื้นที่เก็บข้อมูล UUID v7 สามารถเรียงลำดับตามเวลาสร้างได้แบบ lexicographic ซึ่งทำให้ B-tree index แน่นและทำให้การสืบค้นช่วงเวลามีประสิทธิภาพ เลือก UUID v4 เมื่อ ID ต้องไม่เปิดเผยเวลาที่สร้าง — เช่น token ที่หันหน้าสู่สาธารณะที่ข้อมูลเวลาอาจถูกใช้ประโยชน์ — และ UUID v7 สำหรับ primary key ฐานข้อมูล log การตรวจสอบ และ event stream ที่ลำดับตามเวลาสำคัญ
จะตรวจสอบสตริง UUID v4 ใน JavaScript ได้อย่างไร?
ทดสอบกับ regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i ตัวอักษร "4" ที่ตำแหน่ง 15 (นับจาก 0) ยืนยัน version nibble ตัวอักษรที่ตำแหน่ง 20 — หนึ่งใน 8, 9, a, หรือ b — เข้ารหัส RFC 4122 variant bits regex นี้จะปฏิเสธ UUID v1, v7 และสตริงที่ผิดรูปแบบอย่างถูกต้อง flag i ทำให้ตรวจสอบแบบ case-insensitive ดังนั้นตัวอักษรฐานสิบหกพิมพ์ใหญ่จากระบบอื่นผ่านการตรวจสอบโดยไม่ต้องทำ normalization หากต้องการทราบว่าสตริงเป็น UUID ที่ถูกต้องใด ๆ (ไม่คำนึงถึงเวอร์ชัน) ให้ใช้รูปแบบที่กว้างกว่า /^[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"); // falseจะสร้าง ID ที่สั้นและไม่ซ้ำกันใน JavaScript ได้อย่างไร?
ตัดขีดกลางออกจาก UUID v4 เพื่อได้สตริงฐานสิบหก 32 ตัวอักษร: crypto.randomUUID().replaceAll("-", "") สำหรับสิ่งที่สั้นกว่า ใช้ nanoid ซึ่งสร้าง ID URL-safe 21 ตัวอักษร (A–Z, a–z, 0–9, _ และ -) ตามค่าเริ่มต้นพร้อมความต้านทานการชนกันที่เทียบเคียงกับ UUID เต็มรูปแบบ การแลกเปลี่ยนนั้นตรงไปตรงมา: ID ที่สั้นกว่ามีความน่าจะเป็นในการชนกันสูงกว่า แต่ nanoid ที่ 21 ตัวอักษรยังคงให้ 126 บิตของ entropy ซึ่งมากกว่าเพียงพอสำหรับแอปพลิเคชันในโลกจริงเกือบทุกแอป สำหรับ URL slug และ QR code คุณสามารถสั้นถึง 10–12 ตัวอักษรด้วย nanoid ก่อนที่ความน่าจะเป็นในการชนกันจะกลายเป็นข้อกังวลในอัตราการสร้างทั่วไป อย่า Base64 encode UUID ดิบและตัดทอน — การตัดทอนทำลายความเป็นอิสระทางสถิติของบิตและทำให้การชนกันยากต่อการให้เหตุผล
// สตริงฐานสิบหก 32 ตัวอักษรจาก UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"
// ID URL-safe 21 ตัวอักษรผ่าน nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"เครื่องมือที่เกี่ยวข้อง
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.