อ่าน 15 นาที

UUID คืออะไร? อธิบาย Universally Unique Identifier

ตั้งแต่ primary key ในฐานข้อมูล ไปจนถึง resource ID ใน API, UUID คือรหัสระบุข้อมูลที่สร้างได้แบบกระจายตัวโดยแทบไม่ต้องกลัวซ้ำ บทความนี้อธิบายรูปแบบ เวอร์ชัน โอกาสชนกัน และวิธีเลือกใช้ให้เหมาะกับระบบจริง

UUID คืออะไร?

UUID ย่อจาก Universally Unique Identifier คือค่าขนาด 128 bits ที่ใช้ระบุข้อมูลในระบบคอมพิวเตอร์ให้ไม่ซ้ำกัน ในบาง ecosystem โดยเฉพาะ Microsoft จะเรียกว่า GUID

จุดเด่นของ UUID คือสามารถสร้าง ID ได้จากหลายเครื่อง หลาย service หรือหลาย region โดยไม่ต้องมี server กลางคอยแจกเลขลำดับ เพราะพื้นที่ค่าที่เป็นไปได้มีขนาดใหญ่มาก คือ 2128 หรือประมาณ 3.4 x 1038

ตัวอย่าง UUID ทั่วไป:

550e8400-e29b-41d4-a716-446655440000

รูปแบบและโครงสร้าง UUID

UUID เขียนเป็นเลขฐาน 16 จำนวน 32 หลัก แบ่งเป็น 5 กลุ่มด้วย hyphen ในรูปแบบ 8-4-4-4-12 รวม 36 ตัวอักษรเมื่อรวม hyphen แต่ค่าจริงภายในคือ 16 bytes หรือ 128 bits

เลขหลักที่ 13 ระบุ version เช่น UUID v4 จะมีเลข 4 ที่ตำแหน่งนี้ ส่วนหลักที่ 17 ระบุ variant สำหรับ UUID ตาม RFC 4122/9562 มักเป็น 8, 9, a หรือ b

เปรียบเทียบ UUID แต่ละเวอร์ชัน

UUID มีหลายเวอร์ชัน แต่ละเวอร์ชันสร้างค่า 128 bits ด้วยวิธีต่างกัน การเลือกใช้ขึ้นกับว่าคุณต้องการความสุ่ม การเรียงตามเวลา deterministic ID หรือความเป็นส่วนตัว

เวอร์ชันวิธีสร้างเหมาะกับ / ข้อควรระวัง
v1เวลา + MAC addressเรียงตามเวลาได้บางส่วน แต่มีความเสี่ยงด้าน privacy เพราะอาจเผย MAC address
v3Namespace + name + MD5สร้างค่าเดิมซ้ำได้จาก input เดิม แต่ใช้ hash เก่า
v4สุ่ม 122 bitsใช้ง่าย รองรับกว้าง เหมาะกับงานทั่วไป
v5Namespace + name + SHA-1สร้าง deterministic ID ที่ input เดิมได้ UUID เดิม
v6ปรับ v1 ให้เรียงตามเวลาได้ดีขึ้นเหมาะกับระบบที่ต้องการ time ordering แต่ยังมีรากจาก v1
v7Unix timestamp + random bitsเหมาะกับฐานข้อมูลและระบบใหม่ เพราะเรียงตามเวลาได้และยังเป็น UUID มาตรฐาน
Nil00000000-0000-0000-0000-000000000000ใช้เป็นค่า null หรือ sentinel ในบางระบบ

UUID v4 สร้างอย่างไร

UUID v4 เป็นเวอร์ชันที่ใช้กันแพร่หลายที่สุด เพราะสร้างจากตัวเลขสุ่มหรือ pseudo-random ทั้งหมด ใช้ง่ายและเหมาะกับงานส่วนใหญ่

ขั้นตอนแบบย่อ

  1. 1. สร้าง random 128 bits ด้วย CSPRNG เช่น Web Crypto API
  2. 2. ตั้ง version bits ให้เป็น 0100 เพื่อบอกว่าเป็น UUID v4
  3. 3. ตั้ง variant bits ให้ตรงกับมาตรฐาน RFC
  4. 4. แปลงเป็น hexadecimal แล้วจัดรูปแบบ 8-4-4-4-12

หลังหัก 4 bits สำหรับ version และ 2 bits สำหรับ variant แล้ว UUID v4 ยังมีความสุ่ม 122 bits หรือประมาณ 5.3 x 1036 ค่าที่เป็นไปได้

const uuid = crypto.randomUUID();
console.log(uuid);

โอกาส UUID ชนกัน

คำถามยอดฮิตคือ “มีโอกาสสร้าง UUID ซ้ำกันไหม?” คำตอบคือมีในทางทฤษฎี แต่ต่ำมากจนแทบไม่ใช่ปัญหาในระบบปกติ

สำหรับ UUID v4 ต้องสร้างประมาณ 261 ค่า หรือราว 2.3 x 1018 ค่า จึงจะมีโอกาสชนกันประมาณ 50% ตาม birthday paradox ถ้าสร้าง 1 ล้านค่า โอกาสชนกันยังเล็กมากในระดับประมาณ 1 ใน 1025

สิ่งที่สำคัญกว่าคือคุณภาพของ random number generator ควรใช้ CSPRNG เช่น crypto.randomUUID() หรือ crypto.getRandomValues() และหลีกเลี่ยง Math.random()

UUID ในฐานข้อมูล

UUID นิยมใช้เป็น primary key เพราะแต่ละ service หรือ client สามารถสร้าง ID เองได้ก่อน insert เหมาะกับระบบกระจายตัว multi-region และการ sync ข้อมูล

ข้อดี

  • • ไม่ต้องมี sequence generator กลาง
  • • สร้างฝั่ง client ได้ก่อนส่ง database
  • • ไม่เปิดเผยจำนวน record เหมือนเลข auto-increment
  • • รวมข้อมูลจากหลายระบบได้ง่ายกว่า

ข้อแลกเปลี่ยน

  • • ใหญ่กว่า integer key และอ่านยากกว่า
  • • UUID v4 สุ่ม ทำให้ B-tree index กระจัดกระจาย
  • • ควรเก็บเป็น native UUID หรือ BINARY(16) แทน VARCHAR(36) เมื่อทำได้
  • • ใช้ UUID v7 หรือ ULID หากต้องการ insert แบบเรียงเวลา

UUID เทียบกับ Auto-Increment, ULID และ Snowflake

วิธีข้อดีข้อจำกัด
Auto-increment integerอ่านง่ายและ index เร็วต้องพึ่ง sequence กลาง คาดเดาจำนวน record ได้ และไม่เหมาะกับ distributed generation
UUID v4กระจายการสร้างได้ ไม่ต้องประสานงาน และไม่เปิดเผยลำดับสุ่มเต็มที่ ทำให้ index ฐานข้อมูลกระจัดกระจาย
UUID v7ยังเป็น UUID มาตรฐาน แต่เรียงตามเวลา เหมาะกับ database insertรองรับใหม่กว่า v4 จึงต้องตรวจ library และ platform
ULIDสั้นกว่า อ่านง่ายกว่า และเรียงตามเวลาได้ไม่ใช่ UUID มาตรฐานและ tooling บางระบบรองรับน้อยกว่า
Snowflake IDสั้นและเรียงเวลาได้ดี เหมาะกับ scale ใหญ่มากต้องจัดการ worker ID และ clock drift

ตัวอย่างการใช้งาน UUID

  • Database primary keys: ใช้เป็น ID หลักใน PostgreSQL, MySQL, Rails, Django, Laravel และ Prisma
  • API resource IDs: เช่น /api/users/550e8400-e29b-41d4-a716-446655440000 โดยไม่เผยจำนวนผู้ใช้ทั้งหมด
  • Distributed tracing: ใช้เป็น correlation ID เพื่อติดตาม request ผ่านหลาย service
  • Security tokens: ใช้กับ session, CSRF, password reset หรือ email verification เมื่อสร้างด้วย CSPRNG
  • Object storage และ message queues: ลดการชนกันของชื่อ object และใช้ deduplication ได้
  • Deterministic IDs: UUID v5 ใช้สร้าง ID เดิมจาก namespace + name เดิม เช่น URL หรือ email

UUID v7 และอนาคตของ UUID

UUID v7 ถูกนิยามใน RFC 9562 ปี 2024 โดยรวม Unix timestamp แบบ millisecond ไว้ใน 48 bits แรก แล้วตามด้วย random data ทำให้ UUID ยังคงกระจายการสร้างได้ แต่เรียงตามเวลาได้ดีกว่า v4

ข้อดีสำคัญคือเหมาะกับฐานข้อมูลมากขึ้น เพราะ ID ใหม่มักมีค่ามากกว่า ID เก่า ทำให้การ insert ใน B-tree index มี locality ดีขึ้น ลด page split และ random I/O

สำหรับโปรเจกต์ใหม่ที่ใช้ UUID เป็น database key และต้องการเรียงตามเวลา UUID v7 เป็นตัวเลือกที่น่าสนใจมากขึ้นเรื่อย ๆ แต่ควรตรวจว่า database, library และ validator ใน stack รองรับแล้วหรือยัง

แนวทางใช้งานที่ดี

ควรทำ

  • • ใช้ UUID v4 เป็นค่า default เมื่อต้องการความเรียบง่ายและรองรับกว้าง
  • • พิจารณา UUID v7 สำหรับ database keys ที่ต้องการ time ordering
  • • เก็บเป็น native UUID หรือ BINARY(16) เมื่อทำได้
  • • ใช้ CSPRNG เช่น crypto.randomUUID()
  • • validate UUID เมื่อรับค่าจากภายนอก

ไม่ควรทำ

  • • อย่าใช้ Math.random() สร้าง UUID
  • • อย่าคิดว่า UUID เป็น secret แทน authentication ได้
  • • หลีกเลี่ยง UUID v1 ในบริบทที่ sensitive ต่อ privacy
  • • อย่าคาดหวังว่า UUID v4 จะเรียงตามเวลา
  • • อย่าตัด UUID ให้สั้นลงโดยไม่เข้าใจ collision risk

สร้าง UUID ได้ทันที

ใช้เครื่องมือ UUID Generator ฟรีของเราเพื่อสร้าง UUID v4, v1 หรือ nil UUID แบบเดี่ยวหรือหลายรายการ ตรวจรูปแบบ และปรับ output ได้ โดยประมวลผลในเบราว์เซอร์ของคุณ

เปิด UUID Generator

แหล่งอ้างอิง

  • RFC 4122 - “A Universally Unique IDentifier (UUID) URN Namespace” (2005)
  • RFC 9562 - “Universally Unique IDentifiers (UUIDs)” (2024), นิยาม UUID v6, v7 และ v8
  • PostgreSQL Documentation - UUID data type และฟังก์ชัน gen_random_uuid()
  • MDN Web Docs - crypto.randomUUID() ใน Web Crypto API
  • uuid npm package - ไลบรารี JavaScript สำหรับ UUID v1, v3, v4, v5 และ v7
USTHJP