Trình tạo CUID

Tạo ID duy nhất chống va chạm (CUID v1)

Số lượng

CUID đã tạo

Nhấn Tạo để tạo CUID

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:

Ví dụ:: clrc4gkwz001ag2hs3k7f9m2q
cTiền tốKý tự hằng 'c' làm dấu hiệu nhận dạng
lrc4gkwzTimestampUnix time theo mili giây, mã hóa base36
001aCounterCounter tuần tự ngăn va chạm cùng thời điểm
g2hsFingerprintFingerprint host duy nhất từ PID và hostname
3k7f9m2qNgẫu nhiênSegment ngẫu nhiên để tăng tính duy nhất

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:

Độ Chính Xác Thời Gian
Độ chính xác mili giây có nghĩa là các ID được tạo trong các luồng thực thi khác nhau thường bắt đầu bằng các giá trị khác nhau.
Counter Tuần Tự
Ngay cả khi hai ID được tạo trong cùng một mili giây, counter tăng lên để đảm bảo tính duy nhất trong một tiến trình.
Fingerprint Host
Fingerprint lấy từ PID và hostname phân biệt các ID được phát hành từ các máy chủ khác nhau.
Entropy Ngẫu Nhiên
Segment ngẫu nhiên thêm lớp phòng thủ bổ sung chống lại các va chạm còn lại.

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ăngCUID v1UUID v4
Định dạngChữ thường alphanumericHex có dấu gạch ngang
Có thể sắp xếpMột phần (timestamp đầu tiên)Không (v4 ngẫu nhiên)
An toàn URLCó (với dấu gạch ngang)
Kháng Va ChạmCao (cấu trúc)Cao (thống kê)
Tính Dự ĐoánThấp (timestamp hiển thị)Rất thấp
Độ dài25 ký tự36 ký tự
Cần phối hợpKhôngKhô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ínhCUID v1CUID v2
Thuật toánTùy chỉnhSHA3 + CSPRNG
Mật mã họcKhông (có thể dự đoán)Có (an toàn mật mã)
TimestampHiển thị rõ ràngẨn trong hash
Định dạngLuôn bắt đầu bằng 'c'Tiền tố có thể tùy chỉnh
Package npmcuid@paralleldrive/cuid2
Độ dàiCố đị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

ID Cơ Sở Dữ Liệu
Lý tưởng làm khóa chính — dễ đọc, nhỏ gọn, an toàn URL không cần mã hóa.
Quản Lý Session
Tạo ID session duy nhất cho ứng dụng web với khả năng kháng đoán.
ID Yêu Cầu
Theo dõi yêu cầu qua các hệ thống phân tán với ID duy nhất có thể ghi nhật ký và tracing.
ID Tệp
Tạo tên tệp duy nhất cho nội dung được tải lên hoặc tệp tạm thời.
Đồng Bộ Dữ Liệu
Đồng bộ dữ liệu trên nhiều thiết bị hoặc cơ sở dữ liệu phân tán với sự tự tin về tính duy nhất.
Định Danh URL
Tạo liên kết ngắn hoặc ID video với đảm bảo va chạm tối thiểu.

Ví Dụ Mã

Cài đặt và sử dụng cơ bản:

JavaScript / TypeScript
// 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:

Node.js (no dependencies)
// 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:

Prisma / SQL
-- 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())
}

Câu Hỏi Thường Gặp

CUID có thực sự duy nhất trên các máy chủ khác nhau không?
Có — cơ chế fingerprint (PID + hostname) đảm bảo rằng các ID được phát hành từ các máy chủ khác nhau khác nhau ở phần fingerprint. Counter dựa trên thời gian và segment ngẫu nhiên cung cấp thêm sự bảo vệ.
CUID có thể sử dụng trong trình duyệt không?
Có — thư viện CUID tương thích với cả trình duyệt và Node.js. Trong môi trường trình duyệt, fingerprint sử dụng thông tin navigator và một số dữ liệu khác thay vì dữ liệu tiến trình.
CUID lớn như thế nào so với các lựa chọn thay thế?
CUID v1 có độ dài cố định 25 ký tự. UUID v4 có 36 ký tự với dấu gạch ngang. NanoID có thể tùy chỉnh, thường 21 ký tự. CUID v2 có thể tùy chỉnh, mặc định 24 ký tự.
CUID có an toàn mật mã không?
CUID v1 không an toàn mật mã — timestamp hiển thị và một số thành phần có thể dự đoán. CUID v2 sử dụng SHA3 và CSPRNG, phù hợp cho các trường hợp nhạy cảm bảo mật.
Sự khác biệt chính giữa CUID và NanoID là gì?
NanoID tập trung vào kích thước nhỏ và bảo mật mật mã với kích thước hoàn toàn có thể tùy chỉnh. CUID ưu tiên khả năng sắp xếp thời gian một phần và tính khác biệt trực quan. CUID v2 kết hợp bảo mật với danh tính có thể nhận ra.
CUID xử lý va chạm như thế nào?
Va chạm về mặt lý thuyết là có thể nhưng rất khó xảy ra về mặt thống kê. Counter ngăn va chạm trong một tiến trình; fingerprint tách biệt các máy khác nhau; segment ngẫu nhiên xử lý các trường hợp biên. Thuật toán được thiết kế cho các hệ thống production thực tế.