Developer Tools

UUID คืออะไร: เมื่อไหร่ควรใช้และทำงานอย่างไร

เรียนรู้ว่า UUID คืออะไร ความแตกต่างระหว่างแต่ละเวอร์ชัน ความเสี่ยงของการชนกัน และวิธีสร้างอย่างปลอดภัยสำหรับฐานข้อมูลและ API

7 นาทีในการอ่าน

Server room abstract

UUID (Universally Unique Identifier) คือป้ายกำกับขนาด 128 บิต ที่มักเขียนในรูปแบบ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx นักพัฒนาใช้ UUID เป็น primary key, correlation ID และ opaque token เนื่องจากสามารถสร้างได้โดยไม่ต้องมีตัวกลางควบคุม และมีโอกาสชนกันน้อยมากในทางปฏิบัติ

ทำไมไม่ใช้แค่ตัวเลขจำนวนเต็ม?

การใช้ integer แบบ auto-increment นั้นเรียบง่ายและกระทัดรัด แต่ก็เปิดเผยข้อมูลโดยไม่ตั้งใจ เช่น คู่แข่งสามารถเดาได้ว่าคุณมีออเดอร์กี่รายการ หรือดึงข้อมูลโดยการวนไล่ ID UUID นั้นเดาไม่ได้ในทางปฏิบัติ และปลอดภัยสำหรับการใช้งานใน URL และโค้ดฝั่ง client

UUID ไม่ใช่ฟีเจอร์ด้านความปลอดภัยในตัวมันเอง หากต้องการการตรวจสอบสิทธิ์ ยังคงต้องบังคับใช้บนฝั่ง server อยู่ดี

UUID เวอร์ชันที่พบบ่อย

เวอร์ชัน วิธีการสร้าง การใช้งานทั่วไป
v1 MAC address + timestamp เป็น Legacy ควรหลีกเลี่ยงหากให้ความสำคัญกับความเป็นส่วนตัว
v4 บิตสุ่ม ตัวเลือกหลัก สำหรับระบบใหม่
v5 SHA-1 hash ของ namespace + name สร้าง ID แบบ Deterministic จาก input ที่คงที่

แอปพลิเคชันส่วนใหญ่ในปัจจุบันใช้ UUID v4 สำหรับ primary key บางทีมนิยม ULID หรือ Snowflake ID เพื่อให้เรียงตามเวลาได้ แต่ UUID ยังคงเป็นที่รองรับกันอย่างแพร่หลายที่สุด

ความน่าจะเป็นของการชนกัน

สำหรับ v4 โอกาสที่จะเกิดการชนกันนั้นต่ำอย่างเหลือเชื่อ จนกว่าคุณจะสร้าง ID หลายพันล้านตัวต่อวินาที สำหรับเว็บแอปทั่วไป การมองว่าการชนกันนั้นเป็นไปไม่ได้ถือว่าสมเหตุสมผล ตราบใดที่แหล่ง random ของคุณมีความแข็งแกร่งเชิง Cryptographic (ใช้ OS หรือ CSPRNG ของภาษา ไม่ใช่ Math.random() สำหรับ ID ที่ต้องการความปลอดภัย)

// Browser: prefer crypto.randomUUID() when available
const id = crypto.randomUUID();
console.log(id); // e.g. 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d

เคล็ดลับในทางปฏิบัติ

  • Database index: UUID แบบสุ่มทำให้ B-tree index แตกกระจายมากกว่า ID แบบ sequential หาก insert performance สำคัญในระดับขนาดใหญ่ ลองใช้ gen_random_uuid() ของ PostgreSQL, UUID v7 (เรียงตามเวลา) หรือเทคนิค COMB-style
  • Log และ Tracing: ใช้ UUID ต่อหนึ่ง request เป็น correlation ID เพื่อให้คุณค้นหา log ข้ามหลาย service ได้สะดวก
  • Testing: สร้าง UUID ใหม่ใน fixture เพื่อให้ test ไม่ขึ้นอยู่กับค่าที่ตายตัว เว้นแต่คุณต้องการความสามารถในการสร้างซ้ำ (ในกรณีนั้น v5 หรือ generator แบบกำหนด seed อาจเหมาะกว่า)

ลองใช้งานบน Browser

ใช้ UUID Generator ฟรีของเราเพื่อสร้าง identifier แบบ v4 ได้ทันที ไม่ต้องสมัครสมาชิก และทุกอย่างรันบน tab ของคุณในเครื่องเลย

สำหรับ workflow ที่เกี่ยวข้อง คุณอาจสนใจ Hash Generator สำหรับ checksum และ JWT Decoder เมื่อต้อง debug token ที่มักอยู่คู่กับ UUID ใน API