Trình tạo CUID2

Tạo định danh CUID2 thế hệ tiếp theo an toàn

Số lượng
Độ dài

CUID2 đã tạo

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

CUID2 là gì?

CUID2 là thế hệ thứ hai của CUID, được viết lại từ đầu với trọng tâm là bảo mật mật mã và quyền riêng tư.

Không giống CUID v1 nhúng timestamp một cách hiển thị, CUID2 ẩn tất cả các thành phần trong hash SHA3, tạo ra các chuỗi thực tế không thể dự đoán.

Các ID bắt đầu bằng tiền tố chữ cái có thể tùy chỉnh (mặc định c) theo sau là chuỗi base36 của hash SHA3.

Tại Sao CUID2?

CUID2 ra đời để đáp lại các lo ngại bảo mật cụ thể trong CUID v1:

  • Timestamp bị lộ: CUID v1 tiết lộ thời gian tạo ở đầu mỗi ID.
  • Tính dự đoán: Với kiến thức về cấu trúc CUID v1, một phần trạng thái nội bộ có thể được suy ra.
  • Thiếu bảo mật mật mã: CUID v1 không rõ ràng sử dụng bộ tạo số ngẫu nhiên an toàn mật mã.

CUID2 giải quyết những lo ngại này bằng cách sử dụng SHA3, CSPRNG và ẩn timestamp.

Nguyên Tắc Thiết Kế

Bảo Mật Mật Mã
Sử dụng CSPRNG và SHA3 để đảm bảo ID không thể dự đoán ngay cả khi biết khung thời gian.
Quyền Riêng Tư Timestamp
Timestamp được trộn vào hash và không xuất hiện trực tiếp, bảo vệ quyền riêng tư thời gian.
Tiền Tố Tùy Chỉnh
Chỉ định tiền tố tùy chỉnh để phân biệt ID của các loại thực thể khác nhau (vd: usr_, prd_).
Độ Dài Tùy Chỉnh
Độ dài mặc định 24 ký tự nhưng có thể điều chỉnh theo yêu cầu ứng dụng.
Fingerprint Dùng Chung
Chia sẻ giá trị fingerprint ngẫu nhiên qua các lần gọi hàm để phân phối entropy tốt hơn.
Tương Thích Cơ Sở Dữ Liệu
Luôn bắt đầu bằng chữ cái, tương thích với tên biến và các ràng buộc cơ sở dữ liệu.

CUID2 so với CUID v1

So sánh các đặc điểm chính giữa hai thế hệ:

Thuộc tínhCUID2CUID v1
Bảo mậtMật mã (SHA3+CSPRNG)Không mật mã
Tính Dự ĐoánRất thấpThấp (timestamp bị lộ)
Độ dàiTùy chỉnh (mặc định 24)Cố định 25 ký tự
Tiền tốTùy chỉnhCố định 'c'
Phân phốiPhân phối đềuLệch timestamp
Trạng tháiHoạt động & được khuyến nghịĐã lỗi thời

CUID2 so với UUID v4

So sánh với tiêu chuẩn UUID phổ biến:

Thuộc tínhCUID2UUID v4
Độ Dài Mặc Định24 ký tự36 ký tự
An Toàn URLCó (với dấu gạch ngang)
Độ Dài Tùy ChỉnhKhông
Có Thể Sắp XếpKhôngKhông
EntropyCao (SHA3)Cao (CSPRNG)
Bộ Ký TựChữ thường alphanumericHex + dấu gạch ngang

CUID2 cung cấp tiền tố chữ cái được đảm bảo và độ dài linh hoạt với bảo mật tương đương UUID v4.

Ai Sử Dụng CUID2?

CUID2 đã được các cộng đồng và framework nổi tiếng áp dụng:

  • Prisma hỗ trợ CUID2 như một loại ID trong trường @id qua @default(cuid()).
  • Cộng đồng Drizzle ORM áp dụng CUID2 cho ID mặc định.
  • Các dự án SvelteKitRemix sử dụng nó cho ID session.
  • Máy chủ API khối lượng cao cần ID có thể theo dõi trong nhật ký.
  • Các ứng dụng đồng bộ trên nhiều cơ sở dữ liệu hoặc vùng.

Ví Dụ Mã

Cài đặt và sử dụng: pnpm add @paralleldrive/cuid2

JavaScript (npm — @paralleldrive/cuid2)
import { createId } from '@paralleldrive/cuid2'

// Generate a single CUID2 (default length: 24)
const id = createId()
console.log(id) // e.g. "tz4a98xxat96iws9zmbrgj3a"

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 16 })
const shortId = createShortId()
console.log(shortId) // e.g. "tz4a98xxat96iws9"

Cấu hình nâng cao:

Prisma Schema
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

Tích hợp cơ sở dữ liệu:

Node.js (Web Crypto — no dependencies)
async function generateCuid2(length = 24) {
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'

  // Random prefix letter
  const firstByte = crypto.getRandomValues(new Uint8Array(1))[0]
  const firstChar = alphabet[firstByte % 26]

  // Random 32-byte salt
  const salt = crypto.getRandomValues(new Uint8Array(32))
  const saltHex = [...salt].map(b => b.toString(16).padStart(2, '0')).join('')

  // SHA-512 of timestamp + salt
  const input = Date.now().toString(36) + saltHex
  const hashBuffer = await crypto.subtle.digest(
    'SHA-512',
    new TextEncoder().encode(input)
  )

  // Encode hash bytes as base-36 string
  const bytes = new Uint8Array(hashBuffer)
  let hash = ''
  for (let i = 0; i < bytes.length; i += 8) {
    let chunk = 0n
    for (let j = 0; j < 8 && i + j < bytes.length; j++) {
      chunk = (chunk << 8n) | BigInt(bytes[i + j])
    }
    hash += chunk.toString(36)
  }

  return (firstChar + hash).slice(0, length)
}

// Usage
const id = await generateCuid2()
console.log(id) // e.g. "m7k3r9p2nxq8zt5a6cwj4bvd"

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

CUID2 có chậm hơn CUID v1 do SHA3 không?
Một chút — SHA3 chậm hơn thuật toán tùy chỉnh của CUID v1, nhưng sự khác biệt không đáng kể trong hầu hết các ứng dụng. CUID2 tạo ra hàng chục nghìn ID mỗi giây, nhanh hơn nhiều so với round-trip cơ sở dữ liệu thông thường.
Tôi có thể nâng cấp từ CUID v1 lên CUID2 mà không cần di chuyển dữ liệu không?
Bạn có thể thêm cột CUID2 và chuyển đổi dần dần cho các bản ghi mới. Nếu sử dụng CUID làm khóa chính, bạn cần kế hoạch di chuyển vì định dạng khác nhau.
CUID2 có bao nhiêu entropy?
Ở độ dài mặc định 24 ký tự, CUID2 cung cấp khoảng 118 bit entropy — nhiều hơn UUID v4 (122 bit ngẫu nhiên, nhưng một số được xác định cho phiên bản). Độ dài tùy chỉnh điều chỉnh entropy theo tuyến tính.
CUID2 có phù hợp cho ID hướng quyền riêng tư không?
Có — không giống CUID v1, CUID2 không tiết lộ thời gian tạo hoặc thông tin host. Timestamp được trộn vào hash và không thể trích xuất từ ID đơn lẻ.
Độ dài tối ưu cho CUID2 là bao nhiêu?
Độ dài 24 (mặc định) đủ cho hầu hết các ứng dụng. Nếu tạo hàng triệu ID mỗi ngày, hãy xem xét tăng lên 32. Tối thiểu được khuyến nghị là 16 ký tự để duy trì khả năng kháng va chạm đầy đủ.
Tôi có thể sử dụng CUID2 trong trình duyệt không?
Có — thư viện CUID2 chạy trong trình duyệt qua Web Crypto API, và trong Node.js qua mô-đun crypto. Phù hợp cho cả ứng dụng phía client và server.