Trình tạo CUID
Tạo ID duy nhất chống va chạm (CUID v1)
CUID đã tạo
CUID v1 là định dạng cũ. Với dự án mới, hãy dùng CUID2.
CUID là gì?
CUID (Collision-resistant Unique IDentifier) là ID duy nhất toàn cầu được thiết kế cho các ứng dụng có thể mở rộng theo chiều ngang.
Luôn bắt đầu bằng chữ c, theo sau là timestamp, counter, host fingerprint và segment ngẫu nhiên — tất cả được mã hóa base36.
Các ID an toàn cho URL, nhỏ gọn và dễ đọc, phù hợp cho ID cơ sở dữ liệu, URL và tạo session.
Cấu trúc CUID
Mỗi CUID bao gồm năm phần riêng biệt để đảm bảo tính duy nhất trên các máy, tiến trình và thời gian:
Thiết kế phân cấp này đảm bảo ID được sắp xếp theo thứ tự thời gian trong khi duy trì đủ entropy ngẫu nhiên cho các hệ thống phân tán.
Kháng Va Chạm
CUID kết hợp nhiều cơ chế để đảm bảo tính duy nhất:
CUID so với UUID
Cả CUID và UUID đều giải quyết vấn đề tính duy nhất nhưng theo các cách tiếp cận khác nhau:
| Tính năng | CUID v1 | UUID v4 |
|---|---|---|
| Định dạng | Chữ thường alphanumeric | Hex có dấu gạch ngang |
| Có thể sắp xếp | Một phần (timestamp đầu tiên) | Không (v4 ngẫu nhiên) |
| An toàn URL | Có | Có (với dấu gạch ngang) |
| Kháng Va Chạm | Cao (cấu trúc) | Cao (thống kê) |
| Tính Dự Đoán | Thấp (timestamp hiển thị) | Rất thấp |
| Độ dài | 25 ký tự | 36 ký tự |
| Cần phối hợp | Không | Không |
CUID tốt hơn cho ID cơ sở dữ liệu hiển thị và URL; UUID phổ biến hơn và được hỗ trợ rộng rãi hơn.
CUID v1 so với CUID v2
CUID v2 là bản viết lại thuật toán hoàn chỉnh giải quyết các lo ngại bảo mật trong CUID v1:
| Thuộc tính | CUID v1 | CUID v2 |
|---|---|---|
| Thuật toán | Tùy chỉnh | SHA3 + CSPRNG |
| Mật mã học | Không (có thể dự đoán) | Có (an toàn mật mã) |
| Timestamp | Hiển thị rõ ràng | Ẩn trong hash |
| Định dạng | Luôn bắt đầu bằng 'c' | Tiền tố có thể tùy chỉnh |
| Package npm | cuid | @paralleldrive/cuid2 |
| Độ dài | Cố định 25 ký tự | Có thể tùy chỉnh (mặc định 24) |
Đối với các dự án mới, CUID v2 được khuyến nghị vì cung cấp đảm bảo bảo mật mạnh hơn trong khi vẫn dễ sử dụng.
Trường Hợp Sử Dụng Phổ Biến
va chạm tối thiểu.Ví Dụ Mã
Cài đặt và sử dụng cơ bản:
// 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'Tích hợp Node.js và cơ sở dữ liệu phổ biến:
// 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'Sử dụng constraint cơ sở dữ liệu:
-- 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())
}