ToolDeck

เครื่องสร้าง CUID2

สร้าง identifier CUID2 รุ่นใหม่ที่ปลอดภัย

จำนวน
ความยาว

CUID2 ที่สร้างแล้ว

คลิกสร้างเพื่อสร้าง CUID2

CUID2 คืออะไร?

CUID2 คือรุ่นที่สองของ CUID เขียนใหม่ตั้งแต่ต้นโดยมุ่งเน้นที่ความปลอดภัยทางการเข้ารหัสและความเป็นส่วนตัว

ต่างจาก CUID v1 ที่ฝัง timestamp อย่างมองเห็นได้ CUID2 ซ่อนทุกส่วนประกอบไว้ใน hash SHA3 สร้าง string ที่ไม่สามารถคาดเดาได้ในทางปฏิบัติ

ID เริ่มต้นด้วย prefix ตัวอักษรที่ปรับแต่งได้ (ค่าเริ่มต้น c) ตามด้วย base36 string ของ hash SHA3

ทำไมต้องใช้ CUID2?

CUID2 เกิดขึ้นเพื่อตอบสนองต่อข้อกังวลด้านความปลอดภัยเฉพาะใน CUID v1:

  • Timestamp ที่เปิดเผย: CUID v1 เปิดเผยเวลาสร้างที่จุดเริ่มต้นของ ID แต่ละตัว
  • ความสามารถในการคาดเดา: ด้วยความรู้เกี่ยวกับโครงสร้าง CUID v1 สามารถอนุมาน state ภายในบางส่วนได้
  • ขาดความปลอดภัยทางการเข้ารหัส: CUID v1 ไม่ได้ใช้ตัวสร้างตัวเลขสุ่มที่ปลอดภัยทางการเข้ารหัสอย่างชัดเจน

CUID2 แก้ไขข้อกังวลเหล่านี้โดยใช้ SHA3, CSPRNG และการซ่อน timestamp

หลักการออกแบบ

ความปลอดภัยทางการเข้ารหัส
ใช้ CSPRNG และ SHA3 เพื่อให้มั่นใจว่า ID ไม่สามารถคาดเดาได้แม้จะรู้กรอบเวลา
ความเป็นส่วนตัวของ Timestamp
Timestamp ถูกผสมใน hash และไม่ปรากฏโดยตรง ปกป้องความเป็นส่วนตัวด้านเวลา
Prefix ที่ปรับแต่งได้
ระบุ prefix กำหนดเองเพื่อแยกแยะ ID ของประเภท entity ต่างกัน (เช่น usr_, prd_)
ความยาวที่ปรับแต่งได้
ความยาวค่าเริ่มต้น 24 ตัวอักขระแต่ปรับได้ตามความต้องการของแอปพลิเคชัน
Fingerprint ร่วม
แชร์ค่า fingerprint แบบสุ่มข้ามการเรียกใช้ฟังก์ชันเพื่อการกระจาย entropy ที่ดีกว่า
เข้ากันได้กับฐานข้อมูล
เริ่มต้นด้วยตัวอักษรเสมอ เข้ากันได้กับชื่อตัวแปรและ constraint ฐานข้อมูล

CUID2 เทียบกับ CUID v1

เปรียบเทียบคุณลักษณะสำคัญระหว่างสองรุ่น:

คุณลักษณะCUID2CUID v1
ความปลอดภัยทางการเข้ารหัส (SHA3+CSPRNG)ไม่ใช่การเข้ารหัส
ความสามารถในการคาดเดาต่ำมากต่ำ (timestamp เปิดเผย)
ความยาวปรับแต่งได้ (ค่าเริ่มต้น 24)คงที่ 25 ตัวอักขระ
Prefixปรับแต่งได้คงที่ 'c'
การกระจายกระจายอย่างสม่ำเสมอเอนเอียงตาม timestamp
สถานะใช้งานอยู่ & แนะนำเลิกใช้แล้ว

CUID2 เทียบกับ UUID v4

เปรียบเทียบกับมาตรฐาน UUID ที่ใช้กันทั่วไป:

คุณลักษณะCUID2UUID v4
ความยาวค่าเริ่มต้น24 ตัวอักขระ36 ตัวอักขระ
ปลอดภัยสำหรับ URLใช่ใช่ (พร้อม hyphen)
ความยาวกำหนดเองใช่ไม่
เรียงลำดับได้ไม่ไม่
Entropyสูง (SHA3)สูง (CSPRNG)
ชุดอักขระตัวอักษรตัวเล็กและตัวเลขHex + hyphen

CUID2 ให้ prefix ตัวอักษรที่รับประกันและความยาวที่ยืดหยุ่นพร้อมความปลอดภัยเทียบเท่า UUID v4

ใครใช้ CUID2?

CUID2 ถูกนำมาใช้โดยชุมชนและ framework ที่มีชื่อเสียง:

  • Prisma รองรับ CUID2 เป็นประเภท ID ในฟิลด์ @id ผ่าน @default(cuid())
  • ชุมชน Drizzle ORM นำ CUID2 มาใช้สำหรับ ID เริ่มต้น
  • โปรเจกต์ SvelteKit และ Remix ใช้มันสำหรับ session ID
  • API server ปริมาณสูงที่ต้องการ ID ที่ติดตามได้ใน log
  • แอปพลิเคชันที่ซิงโครไนซ์ในหลายฐานข้อมูลหรือภูมิภาค

ตัวอย่างโค้ด

การติดตั้งและการใช้งาน: 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"

การกำหนดค่าขั้นสูง:

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

การรวมฐานข้อมูล:

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"

คำถามที่พบบ่อย

CUID2 ช้ากว่า CUID v1 เนื่องจาก SHA3 หรือไม่?
เล็กน้อย — SHA3 ช้ากว่า algorithm กำหนดเองของ CUID v1 แต่ความแตกต่างนั้นไม่สังเกตได้ในแอปพลิเคชันส่วนใหญ่ CUID2 สร้าง ID หลายหมื่นตัวต่อวินาที ซึ่งเร็วกว่า database round-trip ทั่วไปมาก
ฉันสามารถอัปเกรดจาก CUID v1 เป็น CUID2 โดยไม่ต้องย้ายข้อมูลได้หรือไม่?
คุณสามารถเพิ่มคอลัมน์ CUID2 และเปลี่ยนแปลงทีละน้อยสำหรับ record ใหม่ หากใช้ CUID เป็น primary key คุณต้องการแผนการย้ายข้อมูลเพราะรูปแบบต่างกัน
CUID2 มี entropy เท่าไร?
ที่ความยาวค่าเริ่มต้น 24 ตัวอักขระ CUID2 ให้ entropy ประมาณ 118 บิต — มากกว่า UUID v4 (122 บิตสุ่ม แต่บางส่วนถูกกำหนดสำหรับ version) ความยาวกำหนดเองปรับ entropy แบบเชิงเส้น
CUID2 เหมาะสำหรับ ID ที่เน้นความเป็นส่วนตัวหรือไม่?
ใช่ — ต่างจาก CUID v1 CUID2 ไม่รั่วไหลเวลาสร้างหรือข้อมูล host Timestamp ถูกผสมใน hash และไม่สามารถดึงออกมาจาก ID เพียงอย่างเดียวได้
ความยาวที่เหมาะสมสำหรับ CUID2 คือเท่าไร?
ความยาว 24 (ค่าเริ่มต้น) เพียงพอสำหรับแอปพลิเคชันส่วนใหญ่ หากสร้าง ID หลายล้านตัวต่อวัน พิจารณาเพิ่มเป็น 32 ขั้นต่ำที่แนะนำคือ 16 ตัวอักขระเพื่อรักษาการต้านทานการชนกันที่เพียงพอ
ฉันสามารถใช้ CUID2 ในเบราว์เซอร์ได้หรือไม่?
ใช่ — ไลบรารี CUID2 ทำงานในเบราว์เซอร์ผ่าน Web Crypto API และใน Node.js ผ่าน crypto module เหมาะสำหรับทั้งแอปพลิเคชัน client-side และ server

เครื่องมือที่เกี่ยวข้อง

เครื่องสร้าง UUID v4สร้าง UUID v4 แบบสุ่มที่ปลอดภัยด้านการเข้ารหัสเครื่องสร้าง UUID v1สร้าง UUID v1 ตามเวลาพร้อม timestamp ที่ฝังอยู่เครื่องสร้าง UUID v7สร้าง UUID v7 เรียงตามเวลาสำหรับ primary key ของฐานข้อมูลเครื่องสร้าง UUID v3สร้าง UUID v3 แบบ deterministic ตามชื่อโดยใช้ MD5เครื่องสร้าง UUID v2สร้าง UUID v2 DCE Security พร้อม local domain และ IDเครื่องสร้าง ULIDสร้าง ID ที่ไม่ซ้ำกันและเรียงลำดับได้ตามตัวอักษรเครื่องสร้าง NanoIDสร้าง ID ที่ไม่ซ้ำกันขนาดเล็กและปลอดภัยสำหรับ URL พร้อมตัวอักษรที่กำหนดเองเครื่องสร้าง CUIDสร้าง ID ที่ไม่ซ้ำกันและทนต่อการชน (CUID v1)ตัวถอดรหัส UUIDถอดรหัสและตรวจสอบโครงสร้าง เวอร์ชัน และข้อมูลที่ฝังใน UUID