DevToolBoxฟรี
บล็อก

UUID v4 vs UUID v7 vs ULID vs NanoID: คุณควรใช้ ID แบบไหน?

10 นาทีในการอ่านโดย DevToolBox
Ad Space

การเลือกรูปแบบตัวระบุเฉพาะที่เหมาะสมสำหรับแอปพลิเคชันของคุณเป็นการตัดสินใจที่ส่งผลต่อประสิทธิภาพฐานข้อมูล ความสามารถในการปรับขนาด และประสบการณ์ของนักพัฒนา เมื่อ UUID v7 กลายเป็นมาตรฐานอย่างเป็นทางการ (RFC 9562 เผยแพร่ในปี 2024) ภูมิทัศน์ของการสร้าง ID ได้เปลี่ยนแปลงไปอย่างมาก คู่มือนี้เปรียบเทียบสี่ตัวเลือกที่ได้รับความนิยมมากที่สุด

ตารางเปรียบเทียบแบบเร็ว

คุณสมบัติUUID v4UUID v7ULIDNanoID
ขนาด (ไบต์)161616Configurable (default 21 chars)
ความยาวสตริง36 chars36 chars26 chars21 chars (default)
เรียงตามเวลาNoYes (ms precision)Yes (ms precision)No
มาตรฐานRFC 9562RFC 9562Community specCommunity spec
เป็นมิตรกับดัชนี DBPoorExcellentExcellentPoor
ความทนทานต่อการชน122 random bits74 random bits + timestamp80 random bits + timestampConfigurable
ปลอดภัยสำหรับ URLYes (with encoding)Yes (with encoding)Yes (native)Yes (native)
การรองรับภาษาUniversalGrowing rapidlyGoodExcellent (JS/TS)

UUID v4: มาตรฐานที่ยืนยง

UUID v4 เป็นตัวเลือกเริ่มต้นมานานกว่าทศวรรษ สร้างตัวระบุ 128 บิตโดยใช้ 122 บิตของความสุ่ม สร้างรูปแบบที่คุ้นเคย xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

จุดแข็ง:

  • การรองรับไลบรารีแบบสากลในทุกภาษาโปรแกรม
  • ไม่ต้องประสานงาน — สร้างได้ทุกที่ทุกเวลา
  • เรียบง่ายและเข้าใจง่าย

จุดอ่อน:

  • การกระจายแบบสุ่มทำให้เกิดการแตกกระจายของดัชนี B-tree ในฐานข้อมูล
  • ไม่มีข้อมูลเวลา — ไม่สามารถเรียงตามลำดับการสร้าง
  • ในระดับขนาดใหญ่ (หลายล้านแถว) ประสิทธิภาพการแทรกจะลดลงอย่างมาก
// JavaScript
crypto.randomUUID();
// → "f47ac10b-58cc-4372-a567-0e02b2c3d479"

ลองใช้เครื่องมือสร้าง UUID ของเรา →

UUID v7: มาตรฐานใหม่ (RFC 9562)

UUID v7 ซึ่งสรุปใน RFC 9562 (2024) ได้รับการออกแบบมาโดยเฉพาะสำหรับใช้เป็นคีย์ฐานข้อมูล มันรวมไทม์สแตมป์ Unix 48 บิต (ความแม่นยำระดับมิลลิวินาที)กับ 74 บิตของความสุ่ม สร้าง UUID ที่เรียงตามเวลาซึ่งเข้ากันได้กับโครงสร้างพื้นฐาน UUID ที่มีอยู่

จุดแข็ง:

  • เรียงตามเวลา — เรียงตามเวลาสร้างโดยธรรมชาติ
  • ประสิทธิภาพการแทรกฐานข้อมูลยอดเยี่ยม (ไม่มีการแตกกระจายของดัชนี)
  • เข้ากันได้กับคอลัมน์และเครื่องมือ UUID ที่มีอยู่ทั้งหมด
  • รองรับแบบ native ใน PostgreSQL 17+

จุดอ่อน:

  • บิตสุ่มน้อยกว่า (74 เทียบกับ 122) — แต่ยังคงทนทานต่อการชนอย่างสูง
  • ไทม์สแตมป์ถูกฝังไว้ — เปิดเผยเวลาสร้างโดยประมาณ
  • การรองรับไลบรารียังคงเติบโต (แต่เร็วมาก)
// Node.js (uuid library v9+)
import { v7 as uuidv7 } from 'uuid';
uuidv7();
// → "018e4f5c-6a7b-7000-8000-1234abcd5678"
//    ^^^^^^^^^^^^^^^^ timestamp portion

ULID: เรียงลำดับตามพจนานุกรมได้

ULID (Universally Unique Lexicographically Sortable Identifier) มีมาก่อน UUID v7 และมีการออกแบบคล้ายกัน: ไทม์สแตมป์ 48 บิต + 80 บิตของความสุ่ม ความแตกต่างหลักคือการเข้ารหัส: Crockford Base32 สร้างสตริงกระชับ 26 ตัวอักษร เช่น 01ARZ3NDEKTSV4RRFFQ69G5FAV

จุดแข็ง:

  • การแสดงผลสตริงที่กระชับ (26 ตัวอักษร เทียบกับ 36 ของ UUID)
  • ความเป็นเอกภาพในตัว — ID ที่สร้างในมิลลิวินาทีเดียวกันยังคงเรียงลำดับ
  • เรียงลำดับตามพจนานุกรมเป็นสตริงได้ (ไม่ต้องเปรียบเทียบพิเศษ)
  • ไม่คำนึงถึงตัวพิมพ์เล็กใหญ่และปลอดภัยสำหรับ URL

จุดอ่อน:

  • ไม่ใช่มาตรฐาน RFC — เป็นเพียงข้อกำหนดของชุมชน
  • ไม่เข้ากันได้กับคอลัมน์ UUID โดยไม่แปลง
  • การรองรับไลบรารีน้อยกว่า UUID
// JavaScript
import { ulid } from 'ulid';
ulid();
// → "01ARZ3NDEKTSV4RRFFQ69G5FAV"

NanoID: กระชับและปรับแต่งได้

NanoID ใช้แนวทางที่แตกต่าง: แทนที่จะใช้รูปแบบตายตัว มันสร้างสตริงสุ่มที่กระชับและปลอดภัยสำหรับ URL ด้วยตัวอักษรและความยาวที่กำหนดเองได้ ค่าเริ่มต้นคือ 21 ตัวอักษรโดยใช้ A-Za-z0-9_-

จุดแข็ง:

  • กระชับมาก (ค่าเริ่มต้น 21 ตัวอักษร ปรับแต่งได้)
  • ปลอดภัยสำหรับ URL โดยค่าเริ่มต้น
  • ตัวอักษรและความยาวที่ปรับแต่งได้
  • ไลบรารีขนาดเล็กมาก (~130 ไบต์ gzip) — เหมาะสำหรับ frontend
  • แข็งแกร่งทางการเข้ารหัส (ใช้ crypto.getRandomValues)

จุดอ่อน:

  • ไม่มีการเรียงตามเวลา — มีปัญหาการแตกกระจาย B-tree เหมือน UUID v4
  • ไม่มีข้อกำหนดมาตรฐาน
  • ไม่เข้ากันได้กับโครงสร้างพื้นฐาน UUID
// JavaScript
import { nanoid } from 'nanoid';
nanoid();
// → "V1StGXR8_Z5jdHi6B-myT"

คู่มือการตัดสินใจ: คุณควรเลือกอันไหน?

ใช้ UUID v7 เมื่อ:

  • สร้างแอปพลิเคชันใหม่ด้วยฐานข้อมูลเชิงสัมพันธ์
  • คุณต้องการ ID ที่เรียงตามเวลาสำหรับการจัดทำดัชนีที่มีประสิทธิภาพ
  • ระบบของคุณคาดหวังรูปแบบ UUID มาตรฐาน (PostgreSQL, MySQL ฯลฯ)
  • คุณต้องการความสมดุลที่ดีที่สุดระหว่างความเข้ากันได้และประสิทธิภาพ

ใช้ UUID v4 เมื่อ:

  • ทำงานกับระบบที่รองรับเฉพาะ UUID v4
  • คุณต้องการความสุ่มสูงสุดโดยไม่รั่วไหลไทม์สแตมป์
  • ขนาดฐานข้อมูลเล็กถึงกลาง (< 1 ล้านแถว)

ใช้ ULID เมื่อ:

  • คุณต้องการการแสดงผลสตริงที่สั้นกว่า
  • ทำงานกับระบบที่เรียงสตริงตามพจนานุกรม
  • ความเป็นเอกภาพในมิลลิวินาทีเดียวกันมีความสำคัญ
  • คุณไม่ต้องการความเข้ากันได้กับคอลัมน์ UUID

ใช้ NanoID เมื่อ:

  • สร้าง ID ในเบราว์เซอร์หรือ frontend
  • ขนาดบันเดิลมีความสำคัญ (NanoID มีขนาด 130 ไบต์)
  • คุณต้องการตัวระบุสั้นที่เป็นมิตรกับ URL
  • สร้างตัวย่อ URL โค้ดเชิญ หรือโทเค็นเซสชัน

เกณฑ์มาตรฐานประสิทธิภาพ: การแทรกฐานข้อมูล

ความแตกต่างที่มีผลกระทบมากที่สุดระหว่างรูปแบบเหล่านี้คือประสิทธิภาพการแทรกฐานข้อมูล ID ที่เรียงตามเวลา (UUID v7, ULID) รักษาการแทรก B-tree แบบลำดับ ในขณะที่ ID สุ่ม (UUID v4, NanoID) ทำให้เกิดการแบ่งหน้าแบบสุ่ม:

รูปแบบ ID1 ล้านการแทรก (PostgreSQL)ขนาดดัชนีรูปแบบการแทรก
เพิ่มอัตโนมัติ~12s (baseline)21 MBSequential
UUID v7~15s (+25%)56 MBNearly sequential
ULID~15s (+25%)56 MBNearly sequential
UUID v4~28s (+133%)56 MBRandom
NanoID (21 chars)~30s (+150%)62 MBRandom

ข้อมูลเกณฑ์มาตรฐานเป็นค่าประมาณและแตกต่างกันตามฮาร์ดแวร์ เวอร์ชันฐานข้อมูล และโครงสร้างตาราง ความแตกต่างสัมพัทธ์มีความสอดคล้องกันในทุกสภาพแวดล้อม

เส้นทางการโยกย้าย: UUID v4 ไปยัง UUID v7

หากคุณกำลังพิจารณาโยกย้ายจาก UUID v4 ไปยัง UUID v7 ข่าวดีคือทั้งสองใช้รูปแบบ 128 บิตและการแสดงผลสตริงเดียวกัน ในฐานข้อมูลส่วนใหญ่ คุณสามารถเริ่มสร้างค่า UUID v7 สำหรับแถวใหม่ในขณะที่ค่า UUID v4 ที่มีอยู่ยังคงใช้ได้:

-- PostgreSQL 17+
CREATE TABLE users (
  id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY,
  name TEXT NOT NULL
);

-- Older PostgreSQL with uuid-ossp or pgcrypto
-- Use application-level UUID v7 generation

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

ฉันควรโยกย้ายจาก UUID v4 ไปยัง UUID v7 หรือไม่?

หากแอปพลิเคชันของคุณใช้ UUID เป็นคีย์หลักของฐานข้อมูลและคุณพบปัญหาการแตกกระจายของดัชนีหรือการแทรกช้าในระดับขนาดใหญ่ การโยกย้ายไปยัง UUID v7 ก็คุ้มค่าที่จะพิจารณา สำหรับแอปขนาดเล็กถึงกลาง UUID v4 ทำงานได้ดี

NanoID ปลอดภัยสำหรับคีย์หลักของฐานข้อมูลหรือไม่?

NanoID มีความปลอดภัยทางการเข้ารหัสและมีความยาวที่กำหนดเองได้ แต่ขาดการเรียงตามเวลา สำหรับคีย์หลักของฐานข้อมูลที่ประสิทธิภาพการแทรกมีความสำคัญ UUID v7 หรือ ULID เป็นตัวเลือกที่ดีกว่า NanoID โดดเด่นในแอปพลิเคชัน frontend และตัวย่อ URL

ความแตกต่างระหว่าง UUID v7 และ ULID คืออะไร?

ทั้งสองเป็นตัวระบุเฉพาะที่เรียงตามเวลา UUID v7 ปฏิบัติตาม RFC 9562 และเข้ากันได้กับโครงสร้างพื้นฐาน UUID ที่มีอยู่ (128 บิต รูปแบบมาตรฐาน) ULID ใช้การเข้ารหัส Crockford Base32 (26 ตัวอักษร) และมีความเป็นเอกภาพในตัวภายในมิลลิวินาทีเดียวกัน UUID v7 ดีกว่าสำหรับระบบที่คาดหวังรูปแบบ UUID ส่วน ULID กระชับกว่าในฐานะสตริง

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

IDUUID Generator
Ad Space

บทความที่เกี่ยวข้อง

Base64 Encoding ในทางปฏิบัติ: 7 การใช้งานจริงที่นักพัฒนาทุกคนควรรู้

ค้นพบ 7 การใช้งานจริงของ Base64 encoding: ฝังรูปภาพ, Kubernetes secrets, JWT tokens และ data URI