ToolDeck

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

สร้าง ID ที่ไม่ซ้ำกันและทนต่อการชน (CUID v1)

จำนวน

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

คลิกสร้างเพื่อสร้าง 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 แต่ละตัวประกอบด้วยห้าส่วนที่แตกต่างกันเพื่อให้มั่นใจในความไม่ซ้ำกันข้ามเครื่อง, กระบวนการ และเวลา:

ตัวอย่าง:: clrc4gkwz001ag2hs3k7f9m2q
cPrefixอักขระ 'c' คงที่เป็นตัวระบุประเภท
lrc4gkwzTimestampUnix time เป็นมิลลิวินาที เข้ารหัส base36
001aCounterCounter ตามลำดับเพื่อป้องกันการชนกันในเวลาเดียวกัน
g2hsFingerprintHost fingerprint ที่ไม่ซ้ำกันจาก PID และ hostname
3k7f9m2qสุ่มSegment แบบสุ่มเพื่อความไม่ซ้ำกันเพิ่มเติม

การออกแบบแบบลำดับชั้นนี้ทำให้ ID เรียงตามลำดับเวลา พร้อมรักษา entropy แบบสุ่มที่เพียงพอสำหรับระบบกระจาย

การต้านทานการชนกัน

CUID รวมกลไกหลายอย่างเพื่อรับประกันความไม่ซ้ำกัน:

ความแม่นยำเชิงเวลา
ความแม่นยำระดับมิลลิวินาทีหมายความว่า ID ที่สร้างในเธรดการทำงานต่างกันมักเริ่มต้นด้วยค่าที่ต่างกัน
Counter ตามลำดับ
แม้ว่า ID สองตัวจะถูกสร้างในมิลลิวินาทีเดียวกัน counter จะเพิ่มขึ้นเพื่อรับประกันความไม่ซ้ำกันภายใน process เดียว
Host Fingerprint
Fingerprint ที่ได้จาก PID และ hostname แยกแยะ ID ที่ออกจากเซิร์ฟเวอร์ต่างกัน
Entropy แบบสุ่ม
Segment แบบสุ่มเพิ่มชั้นป้องกันเพิ่มเติมต่อการชนกันที่เหลืออยู่

CUID เทียบกับ UUID

ทั้ง CUID และ UUID แก้ปัญหาความไม่ซ้ำกัน แต่ด้วยวิธีการที่แตกต่างกัน:

คุณสมบัติCUID v1UUID v4
รูปแบบตัวอักษรตัวเล็กและตัวเลขHex พร้อม hyphen
เรียงลำดับได้บางส่วน (timestamp ก่อน)ไม่ (v4 สุ่ม)
ปลอดภัยสำหรับ URLใช่ใช่ (พร้อม hyphen)
ต้านทานการชนกันสูง (โครงสร้าง)สูง (สถิติ)
ความสามารถในการคาดเดาต่ำ (timestamp มองเห็นได้)ต่ำมาก
ความยาว25 ตัวอักขระ36 ตัวอักขระ
ต้องการการประสานไม่ไม่

CUID ดีกว่าสำหรับ ID ฐานข้อมูลที่มองเห็นได้และ URL; UUID ถูกใช้งานกว้างขวางกว่าและรองรับมากกว่า

CUID v1 เทียบกับ CUID v2

CUID v2 คือการเขียน algorithm ใหม่ทั้งหมดที่แก้ไขปัญหาความปลอดภัยใน CUID v1:

แง่มุมCUID v1CUID v2
AlgorithmกำหนดเองSHA3 + CSPRNG
การเข้ารหัสไม่ (คาดเดาได้)ใช่ (ปลอดภัยทางการเข้ารหัส)
Timestampมองเห็นได้ชัดเจนซ่อนใน hash
รูปแบบเริ่มต้นด้วย 'c' เสมอPrefix ที่ปรับแต่งได้
แพ็คเกจ npmcuid@paralleldrive/cuid2
ความยาวคงที่ 25 ตัวอักขระปรับแต่งได้ (ค่าเริ่มต้น 24)

สำหรับโปรเจกต์ใหม่ แนะนำให้ใช้ CUID v2 ซึ่งให้การรับประกันความปลอดภัยที่แข็งแกร่งกว่าในขณะที่ยังคงใช้งานง่าย

กรณีการใช้งานทั่วไป

ID ฐานข้อมูล
เหมาะสมเป็น primary key — อ่านได้ง่าย กระทัดรัด ปลอดภัยสำหรับ URL โดยไม่ต้องเข้ารหัส
การจัดการ Session
สร้าง session ID ที่ไม่ซ้ำกันสำหรับเว็บแอปพลิเคชันพร้อมการต้านทานการเดา
Request ID
ติดตาม request ในระบบกระจายด้วย ID ที่ไม่ซ้ำกันที่บันทึกและติดตามได้
File ID
สร้างชื่อไฟล์ที่ไม่ซ้ำกันสำหรับเนื้อหาที่อัปโหลดหรือไฟล์ชั่วคราว
การซิงโครไนซ์ข้อมูล
ซิงโครไนซ์ข้อมูลในหลายอุปกรณ์หรือฐานข้อมูลกระจายด้วยความมั่นใจในความไม่ซ้ำกัน
URL Identifier
สร้างลิงก์สั้นหรือ video ID ด้วยการรับประกัน การชนกันน้อยที่สุด

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

การติดตั้งและการใช้งานพื้นฐาน:

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'

การรวม Node.js และฐานข้อมูลทั่วไป:

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'

การใช้ constraint ฐานข้อมูล:

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())
}

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

CUID ไม่ซ้ำกันจริงๆ ข้ามเซิร์ฟเวอร์ต่างกันหรือไม่?
ใช่ — กลไก fingerprint (PID + hostname) ทำให้มั่นใจว่า ID ที่ออกจากเซิร์ฟเวอร์ต่างกันจะแตกต่างกันในส่วน fingerprint counter ที่ใช้เวลาและ segment แบบสุ่มให้การป้องกันเพิ่มเติม
CUID ใช้ในเบราว์เซอร์ได้หรือไม่?
ใช่ — ไลบรารี CUID เข้ากันได้กับทั้งเบราว์เซอร์และ Node.js ในสภาพแวดล้อมเบราว์เซอร์ fingerprint ใช้ข้อมูล navigator และข้อมูลอื่นๆ แทนข้อมูล process
CUID ใหญ่แค่ไหนเมื่อเทียบกับทางเลือกอื่น?
CUID v1 มีความยาวคงที่ 25 ตัวอักขระ UUID v4 มี 36 ตัวอักขระพร้อม hyphen NanoID ปรับแต่งได้ โดยทั่วไป 21 ตัวอักขระ CUID v2 ปรับแต่งได้ ค่าเริ่มต้น 24 ตัวอักขระ
CUID ปลอดภัยทางการเข้ารหัสหรือไม่?
CUID v1 ไม่ปลอดภัยทางการเข้ารหัส — timestamp มองเห็นได้และบางส่วนประกอบคาดเดาได้ CUID v2 ใช้ SHA3 และ CSPRNG ทำให้เหมาะสมสำหรับกรณีที่ต้องการความปลอดภัย
ความแตกต่างหลักระหว่าง CUID และ NanoID คืออะไร?
NanoID มุ่งเน้นที่ขนาดเล็กและความปลอดภัยทางการเข้ารหัสพร้อมขนาดที่ปรับแต่งได้อย่างสมบูรณ์ CUID ให้ความสำคัญกับการเรียงลำดับตามเวลาบางส่วนและความโดดเด่นทางภาพ CUID v2 รวมความปลอดภัยกับ identity ที่จดจำได้
CUID จัดการการชนกันอย่างไร?
การชนกันเป็นไปได้ทางทฤษฎีแต่ไม่น่าจะเกิดขึ้นทางสถิติ counter ป้องกันการชนกันภายใน process เดียว; fingerprint แยก machine ต่างกัน; segment แบบสุ่มจัดการกรณีขอบ algorithm ถูกออกแบบสำหรับระบบ production จริง

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