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 |
| v3 | Namespace + name + MD5 | สร้างค่าเดิมซ้ำได้จาก input เดิม แต่ใช้ hash เก่า |
| v4 | สุ่ม 122 bits | ใช้ง่าย รองรับกว้าง เหมาะกับงานทั่วไป |
| v5 | Namespace + name + SHA-1 | สร้าง deterministic ID ที่ input เดิมได้ UUID เดิม |
| v6 | ปรับ v1 ให้เรียงตามเวลาได้ดีขึ้น | เหมาะกับระบบที่ต้องการ time ordering แต่ยังมีรากจาก v1 |
| v7 | Unix timestamp + random bits | เหมาะกับฐานข้อมูลและระบบใหม่ เพราะเรียงตามเวลาได้และยังเป็น UUID มาตรฐาน |
| Nil | 00000000-0000-0000-0000-000000000000 | ใช้เป็นค่า null หรือ sentinel ในบางระบบ |
UUID v4 สร้างอย่างไร
UUID v4 เป็นเวอร์ชันที่ใช้กันแพร่หลายที่สุด เพราะสร้างจากตัวเลขสุ่มหรือ pseudo-random ทั้งหมด ใช้ง่ายและเหมาะกับงานส่วนใหญ่
ขั้นตอนแบบย่อ
- 1. สร้าง random 128 bits ด้วย CSPRNG เช่น Web Crypto API
- 2. ตั้ง version bits ให้เป็น 0100 เพื่อบอกว่าเป็น UUID v4
- 3. ตั้ง variant bits ให้ตรงกับมาตรฐาน RFC
- 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