เครื่องสร้าง CUID
สร้าง ID ที่ไม่ซ้ำกันและทนต่อการชน (CUID v1)
CUID ที่สร้างแล้ว
CUID v1 เป็นรูปแบบเดิม สำหรับโปรเจกต์ใหม่ ใช้ CUID2
CUID คืออะไร?
CUID (Collision-resistant Unique IDentifier) คือ ID ที่ไม่ซ้ำกันทั่วโลก ออกแบบสำหรับแอปพลิเคชันที่ขยายขนาดได้ในแนวนอน
เริ่มต้นด้วยอักษร c เสมอ ตามด้วย timestamp, counter, host fingerprint และ segment แบบสุ่ม — ทั้งหมดเข้ารหัสด้วย base36
ID ปลอดภัยสำหรับ URL กระทัดรัด และอ่านได้ง่าย เหมาะสำหรับ ID ฐานข้อมูล, URL และการสร้าง session
โครงสร้าง CUID
CUID แต่ละตัวประกอบด้วยห้าส่วนที่แตกต่างกันเพื่อให้มั่นใจในความไม่ซ้ำกันข้ามเครื่อง, กระบวนการ และเวลา:
การออกแบบแบบลำดับชั้นนี้ทำให้ ID เรียงตามลำดับเวลา พร้อมรักษา entropy แบบสุ่มที่เพียงพอสำหรับระบบกระจาย
การต้านทานการชนกัน
CUID รวมกลไกหลายอย่างเพื่อรับประกันความไม่ซ้ำกัน:
CUID เทียบกับ UUID
ทั้ง CUID และ UUID แก้ปัญหาความไม่ซ้ำกัน แต่ด้วยวิธีการที่แตกต่างกัน:
| คุณสมบัติ | CUID v1 | UUID v4 |
|---|---|---|
| รูปแบบ | ตัวอักษรตัวเล็กและตัวเลข | Hex พร้อม hyphen |
| เรียงลำดับได้ | บางส่วน (timestamp ก่อน) | ไม่ (v4 สุ่ม) |
| ปลอดภัยสำหรับ URL | ใช่ | ใช่ (พร้อม hyphen) |
| ต้านทานการชนกัน | สูง (โครงสร้าง) | สูง (สถิติ) |
| ความสามารถในการคาดเดา | ต่ำ (timestamp มองเห็นได้) | ต่ำมาก |
| ความยาว | 25 ตัวอักขระ | 36 ตัวอักขระ |
| ต้องการการประสาน | ไม่ | ไม่ |
CUID ดีกว่าสำหรับ ID ฐานข้อมูลที่มองเห็นได้และ URL; UUID ถูกใช้งานกว้างขวางกว่าและรองรับมากกว่า
CUID v1 เทียบกับ CUID v2
CUID v2 คือการเขียน algorithm ใหม่ทั้งหมดที่แก้ไขปัญหาความปลอดภัยใน CUID v1:
| แง่มุม | CUID v1 | CUID v2 |
|---|---|---|
| Algorithm | กำหนดเอง | SHA3 + CSPRNG |
| การเข้ารหัส | ไม่ (คาดเดาได้) | ใช่ (ปลอดภัยทางการเข้ารหัส) |
| Timestamp | มองเห็นได้ชัดเจน | ซ่อนใน hash |
| รูปแบบ | เริ่มต้นด้วย 'c' เสมอ | Prefix ที่ปรับแต่งได้ |
| แพ็คเกจ npm | cuid | @paralleldrive/cuid2 |
| ความยาว | คงที่ 25 ตัวอักขระ | ปรับแต่งได้ (ค่าเริ่มต้น 24) |
สำหรับโปรเจกต์ใหม่ แนะนำให้ใช้ CUID v2 ซึ่งให้การรับประกันความปลอดภัยที่แข็งแกร่งกว่าในขณะที่ยังคงใช้งานง่าย
กรณีการใช้งานทั่วไป
การชนกันน้อยที่สุดตัวอย่างโค้ด
การติดตั้งและการใช้งานพื้นฐาน:
// npm install @paralleldrive/cuid2 (recommended — CUID v2)
import { createId } from '@paralleldrive/cuid2'
const id = createId()
// → 'tz4a98xxat96iws9zmbrgj3a'
// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 10 })
createShortId() // → 'zxp1l6mf4c'การรวม Node.js และฐานข้อมูลทั่วไป:
// Pure Node.js — CUID v1 style (no dependencies)
let counter = 0
function pad(str, size) {
return str.padStart(size, '0').slice(-size)
}
function fingerprint() {
const os = require('os')
const source = [process.pid, os.hostname().length].join('')
let hash = 0
for (const c of source) {
hash = ((hash << 5) - hash) + c.charCodeAt(0)
hash |= 0
}
return pad(Math.abs(hash).toString(36), 4)
}
function cuid() {
const timestamp = Date.now().toString(36)
const cnt = pad((counter++ & 0xffff).toString(36), 4)
const fp = fingerprint()
const rnd = pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
+ pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
return 'c' + timestamp + cnt + fp + rnd
}
console.log(cuid()) // → 'clrc4gkwz001ag2hs3k7f9m2q'การใช้ constraint ฐานข้อมูล:
-- Use CUID as a primary key in PostgreSQL
CREATE TABLE users (
id TEXT PRIMARY KEY DEFAULT gen_cuid(),
name TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Prisma schema (auto-generates CUID by default)
model User {
id String @id @default(cuid())
name String
createdAt DateTime @default(now())
}