# สร้าง UUID

> สร้าง UUID ออนไลน์ได้ฟรี รองรับทุกเวอร์ชัน (v1, v3-v7) ตั้งแต่แบบสุ่มไปจนถึงแบบ timestamp สร้างพร้อมกันได้หลายพันรายการในเบราว์เซอร์ของคุณ

URL: https://acrafto.com/th/uuid-generator/

Tools are interactive browser apps; there is no public API, no endpoints to call and no server-side processing. To use a tool, open its HTML page in a browser.

## UUID คืออะไร?

UUID (Universally Unique Identifier) คือตัวระบุขนาด 128 บิตที่ใช้ในระบบคอมพิวเตอร์เพื่อระบุข้อมูลได้อย่างไม่ซ้ำกัน UUID ได้รับการกำหนดมาตรฐานตาม RFC 4122 และด้วยเอนโทรปีที่สูงมาก ทำให้แทบไม่มีโอกาสเกิดการชนกันเลย ซึ่งหมายความว่า UUID สองรายการที่สร้างขึ้นอย่างอิสระจะมีความเป็นเอกลักษณ์เกือบแน่นอน

UUID มีรูปแบบมาตรฐานคือ: `xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx` โดยที่ `x` แต่ละตัวคือตัวเลขฐานสิบหก (0-9, a-f), `M` บ่งบอกถึงเวอร์ชันของ UUID และ `N` บ่งบอกถึงรูปแบบ

## เวอร์ชันของ UUID

### UUID v1 (Timestamp + ที่อยู่ MAC)

UUID v1 สร้างขึ้นจาก timestamp ปัจจุบันและค่าสุ่ม (ในเบราว์เซอร์จะใช้ค่าสุ่มแทนที่อยู่ MAC) โดยใช้อินเทอร์วัล 100 นาโนวินาที นับจากวันที่ 15 ตุลาคม 1582 (ปฏิทินเกรกอเรียน)

**การใช้งาน:**

- สถานการณ์ที่คุณต้องการจัดเรียง UUID ตามลำดับเวลา
- การดีบักและการบันทึก (UUID มีข้อมูลเวลาที่สร้าง)
- ระบบแบบกระจายที่ต้องมีการซิงค์เวลา

**ตัวอย่าง:** `6ba7b810-9dad-11d1-80b4-00c04fd430c8`

**ข้อดี:**

- สามารถจัดเรียง UUID ตามลำดับเวลาที่สร้างได้
- มีประโยชน์สำหรับการตรวจสอบและดีบัก
- มีข้อมูล timestamp

**ข้อเสีย:**

- ความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น – มี timestamp
- ในเบราว์เซอร์จะไม่มีที่อยู่ MAC จริง (ถูกแทนที่ด้วยค่าสุ่ม)
- ตำแหน่งข้อมูลใน DB ไม่ดี (timestamp อยู่ในบิตลำดับต่ำ)

### UUID v3 (แฮช MD5)

UUID v3 ถูกสร้างขึ้นโดยใช้แฮช MD5 ของ namespace UUID และชื่อ เป็นแบบกำหนดได้ – namespace + ชื่อเดียวกันจะสร้าง UUID เดียวกันเสมอ

**การใช้งาน:**

- การแปลง URL, ชื่อ DNS หรือตัวระบุอื่นๆ เป็น UUID
- สถานการณ์ที่คุณต้องการ UUID ที่สามารถสร้างซ้ำได้
- การจับคู่ระหว่างระบบระบุตัวตนที่แตกต่างกัน

**ตัวอย่าง:** `a3bb189e-8bf9-3888-9912-ace4e6543002`

**ข้อดี:**

- กำหนดได้ (ข้อมูลเข้าเหมือนกัน = ผลลัพธ์เหมือนกัน)
- เหมาะสำหรับการแปลงตัวระบุที่รู้จัก
- ไม่มีการชนกันสำหรับข้อมูลเข้าที่แตกต่างกัน

**ข้อเสีย:**

- MD5 เป็นอัลกอริทึมที่ล้าสมัย (ควรใช้ v5)
- ต้องมี namespace และ name
- ไม่สามารถกู้คืนข้อมูลเข้าเดิมได้

### UUID v4 (สุ่ม) - แนะนำ

UUID เวอร์ชันที่ใช้บ่อยที่สุด UUID v4 ถูกสร้างขึ้นแบบสุ่มล้วนๆ โดยใช้ตัวสร้างตัวเลขสุ่มที่ปลอดภัยทางคริปโตกราฟี (`crypto.getRandomValues()`)

**การใช้งาน:**

- คีย์หลักของฐานข้อมูล
- ตัวระบุเซสชัน (session IDs)
- ชื่อไฟล์ที่ไม่ซ้ำกัน
- โทเค็น API
- วัตถุประสงค์ทั่วไปที่คุณต้องการ ID ที่ไม่ซ้ำกันอย่างแน่นอน

**ตัวอย่าง:** `f47ac10b-58cc-4372-a567-0e02b2c3d479`

**ข้อดี:**

- เอนโทรปีและความปลอดภัยสูงสุด
- ไม่ขึ้นกับเวลาหรือพารามิเตอร์ของระบบ
- การใช้งานที่ง่ายที่สุด

**โอกาสเกิดการชนกัน:** หากสร้าง UUID v4 1 พันล้านรายการต่อวินาที เป็นเวลา 100 ปี โอกาสที่จะเกิดการชนกันจะอยู่ที่ประมาณ 0.00000006%.

### UUID v5 (แฮช SHA-1)

UUID v5 เหมือนกับ v3 แต่ใช้ SHA-1 แทน MD5 เป็นทางเลือกที่ทันสมัยและปลอดภัยกว่า v3

**การใช้งาน:**

- เหมือนกับ v3 แต่มีความปลอดภัยที่ดีกว่า
- ควรใช้มากกว่า v3 สำหรับโปรเจกต์ใหม่
- การสร้าง UUID จาก URL, ชื่อ DNS, OID, X.500 DN

**ตัวอย่าง:** `886313e1-3b8a-5372-9b90-0c9aee199e5d`

**ข้อดี:**

- กำหนดได้
- SHA-1 แข็งแกร่งกว่า MD5
- เหมาะสำหรับการจับคู่ระหว่างระบบ

**ข้อเสีย:**

- SHA-1 ก็ถูกพิจารณาว่าล้าสมัยเช่นกัน (แต่ยังคงปลอดภัยกว่า MD5)
- ต้องมี namespace และ name

### UUID v6 (Timestamp ที่จัดเรียง)

UUID v6 เป็นเวอร์ชันที่ปรับปรุงจาก v1 โดยมีการจัดเรียงบิตเวลาใหม่เพื่อการทำดัชนี DB ที่ดีขึ้น ออกแบบมาเพื่อแก้ไขปัญหาด้านตำแหน่งข้อมูลในฐานข้อมูล

**การใช้งาน:**

- คีย์หลักของฐานข้อมูลที่จัดเรียงตามเวลา
- ระบบที่ต้องการทั้งการจัดเรียงตามลำดับเวลาและประสิทธิภาพ DB
- ทางเลือกที่ทันสมัยกว่า v1

**ตัวอย่าง:** `1ec9414c-232a-6b00-b3c8-9e6bdeced846`

**ข้อดี:**

- ตำแหน่งข้อมูลใน DB ดีกว่า v1 (timestamp อยู่ในบิตลำดับสูง)
- การจัดเรียงตามลำดับเวลา
- เข้ากันได้กับมาตรฐาน UUID

**ข้อเสีย:**

- ใช้งานน้อยกว่า v1/v4
- ยังคงมีข้อมูลเวลา (ความเสี่ยงด้านความปลอดภัย)

### UUID v7 (Unix timestamp)

UUID v7 ใช้ Unix timestamp (มิลลิวินาทีจากปี 1970) + บิตสุ่ม เป็น UUID เวอร์ชันล่าสุดที่มีตำแหน่งข้อมูลใน DB ดีที่สุด

**การใช้งาน:**

- คีย์หลักของฐานข้อมูลที่ทันสมัย
- ระบบที่ต้องการประสิทธิภาพ + การจัดเรียงตามเวลา
- ใช้แทน v1/v6 ในโปรเจกต์ใหม่

**ตัวอย่าง:** `017f22e2-79b0-7cc3-98c4-dc0c0c07398f`

**ข้อดี:**

- ตำแหน่งข้อมูลใน DB ดีที่สุดในทุกเวอร์ชัน
- Unix timestamp เป็นมาตรฐาน
- รวมข้อดีของการสุ่มและการจัดเรียงตามเวลา

**ข้อเสีย:**

- เป็นข้อกำหนดที่ค่อนข้างใหม่ (RFC 4122bis)
- รองรับน้อยในระบบเก่า

## ควรใช้ UUID เวอร์ชันใด?

### คู่มือการตัดสินใจ

**คุณต้องการความปลอดภัยและการสุ่มสูงสุดหรือไม่?** → ใช้ **UUID v4** (ตัวเลือกที่พบบ่อยที่สุด)

**คุณต้องการการจัดเรียงตามเวลาและประสิทธิภาพ DB หรือไม่?** → ใช้ **UUID v7** (ทันสมัย) หรือ **UUID v6** (มาตรฐาน)

**คุณต้องการ UUID ที่สามารถสร้างซ้ำได้จากตัวระบุที่มีอยู่หรือไม่?** → ใช้ **UUID v5** (SHA-1) หรือ **UUID v3** (MD5, รุ่นเก่า)

**คุณต้องการ timestamp และบันทึกการตรวจสอบหรือไม่?** → ใช้ **UUID v1** (รุ่นเก่า, ประสิทธิภาพ DB แย่กว่า)

### ฐานข้อมูล

**สำหรับโปรเจกต์ใหม่:** UUID v7 หรือ v4

- **v7** เหมาะสำหรับการจัดเรียงตามเวลา + ประสิทธิภาพ
- **v4** สำหรับการสุ่มสูงสุดโดยไม่มีข้อมูลเวลา

**สำหรับระบบเก่า:** UUID v1 หรือ v6

- **v6** มีตำแหน่งข้อมูลใน DB ดีกว่า v1
- **v1** ได้รับการสนับสนุนอย่างกว้างขวาง

**ข้อดีของ UUID เป็นคีย์หลัก:**

- **ความเป็นเอกลักษณ์ทั่วโลก** – คุณสามารถรวมข้อมูลจากฐานข้อมูลที่แตกต่างกันได้โดยไม่มีข้อขัดแย้ง
- **ความปลอดภัย** – แตกต่างจาก ID แบบลำดับ (1, 2, 3…) ไม่สามารถคาดเดาค่าถัดไปได้
- **ระบบแบบกระจาย** – UUID สามารถสร้างขึ้นได้อย่างอิสระบนเซิร์ฟเวอร์หลายเครื่องโดยไม่ต้องมีการประสานงาน
- **การรวมฐานข้อมูล** – เมื่อรวมฐานข้อมูลสองแห่ง จะไม่มีข้อขัดแย้งเกิดขึ้น

**ข้อเสีย:**

- ขนาดใหญ่กว่า (16 ไบต์ เทียบกับ 4-8 ไบต์สำหรับจำนวนเต็ม)
- การทำดัชนีช้าลงในฐานข้อมูลบางประเภท (ใช้ v6/v7 เพื่อประสิทธิภาพที่ดีขึ้น)
- อ่านยากสำหรับมนุษย์

### API และบริการเว็บ

- **REST API** – ตัวระบุที่ไม่ซ้ำกันสำหรับทรัพยากร
- **GraphQL** – ตัวระบุทั่วโลกสำหรับโหนด
- **Webhook** – การติดตามคำขอและการตอบกลับ
- **โทเค็น** – Session IDs, refresh token

### ไฟล์และพื้นที่เก็บข้อมูล

- **ชื่อไฟล์** – ป้องกันการชนกันเมื่ออัปโหลด
- **S3/Cloud Storage** – เส้นทางที่ไม่ซ้ำกันสำหรับอ็อบเจกต์
- **คีย์แคช** – ตัวระบุในระบบแคช

### แอปพลิเคชันส่วนหน้า (Frontend)

- **คอมโพเนนต์ React/Vue** – คีย์ที่ไม่ซ้ำกันสำหรับรายการ
- **Temporary IDs** – ID ก่อนบันทึกลงฐานข้อมูล
- **Local storage** – คีย์สำหรับข้อมูลที่จัดเก็บ
- **แอปพลิเคชันแบบออฟไลน์เป็นหลัก** – การสร้าง ID โดยไม่ต้องเชื่อมต่อกับเซิร์ฟเวอร์

## คุณสมบัติขั้นสูงของเครื่องสร้าง

### การสร้าง UUID ด้วยเวลาที่กำหนดเอง

สำหรับเวอร์ชันที่ใช้เวลาเป็นหลัก (v1, v6, v7) คุณสามารถเลือก timestamp ใดก็ได้โดยใช้ตัวเลือกวันที่และเวลา ซึ่งมีประโยชน์สำหรับ:

**การทดสอบ:**

- การจำลอง UUID ที่สร้างขึ้นในอดีต
- การทดสอบการจัดเรียงตามเวลาในฐานข้อมูล
- การสร้าง UUID ซ้ำเพื่อการดีบัก

**การย้ายข้อมูล:**

- การสร้าง UUID ด้วย timestamp ย้อนหลัง
- การเติมข้อมูลย้อนหลังด้วยค่า timestamp ที่ถูกต้อง
- การนำเข้าข้อมูลจากช่วงเวลาที่แตกต่างกัน

**การตรวจสอบและการปฏิบัติตามข้อกำหนด:**

- การสร้าง UUID ใหม่ตามเวลาที่สร้างบันทึก
- การสร้างตัวระบุย้อนหลัง

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

1. เลือกเวอร์ชัน v1, v6 หรือ v7
2. กำหนดวันที่และเวลาโดยใช้ตัวเลือกวันที่และเวลา
3. สร้าง UUID ด้วย timestamp ที่คุณกำหนดเอง

### UUID ที่ใช้แฮช (v3, v5)

สำหรับ UUID แบบกำหนดได้ คุณสามารถใช้เวอร์ชัน v3 (MD5) หรือ v5 (SHA-1):

**วิธีใช้:**

1. เลือก namespace ตามประเภทตัวระบุของคุณ
2. ป้อนชื่อ/ค่า
3. สร้าง UUID

**ตัวอย่าง:**

| Namespace | ชื่อ (ข้อมูลเข้า) | การใช้งาน |
| --- | --- | --- |
| DNS | `example.com` | แปลงชื่อโดเมนเป็น UUID |
| DNS | `google.com` | ทุกเว็บไซต์มี UUID ที่ไม่ซ้ำกัน |
| URL | `https://example.com/page` | แปลง URL เป็น UUID |
| URL | `https://api.example.com/users/123` | API endpoint เป็น UUID |
| OID | `1.3.6.1.4.1.343` | ตัวระบุวัตถุ (Object Identifier) เป็น UUID |
| X.500 | `CN=John Doe,O=Company` | Distinguished Name เป็น UUID |

**คุณสมบัติที่สำคัญ:**

- ✅ **กำหนดได้**: ข้อมูลเข้าเหมือนกัน = UUID เหมือนกันเสมอ
- ✅ **สร้างซ้ำได้**: คุณสามารถสร้าง UUID ซ้ำได้ทุกเมื่อ
- ✅ **สอดคล้องกัน**: UUID เดียวกันในระบบที่แตกต่างกัน
- ❌ **ไม่สามารถถอดรหัสได้**: ไม่สามารถกู้คืนชื่อเดิมจาก UUID ได้
- ℹ️ **UUID เดียว**: สำหรับ v3/v5 จะสร้างเพียง UUID เดียวเสมอ (ข้อมูลเข้าเหมือนกัน = ผลลัพธ์เหมือนกัน)

**การใช้งานจริง:**

```
// ตัวอย่าง: การแปลง URL เป็น UUID v5
Namespace: URL
ชื่อ: https://example.com/api/users/123
ผลลัพธ์: 886313e1-3b8a-5372-9b90-0c9aee199e5d

// ข้อมูลเข้าเหมือนกัน = UUID เหมือนกันเสมอ
Namespace: DNS
ชื่อ: google.com
ผลลัพธ์: UUID เดียวกันเสมอสำหรับ google.com
```

## วิธีใช้ UUID อย่างปลอดภัย?

### ความปลอดภัยทางคริปโตกราฟี

เครื่องสร้างของเราใช้ `crypto.getRandomValues()` ซึ่งเป็นตัวสร้างตัวเลขสุ่มที่ปลอดภัยทางคริปโตกราฟี แตกต่างจาก `Math.random()` ซึ่งสามารถคาดเดาได้และไม่เหมาะสมสำหรับวัตถุประสงค์ด้านความปลอดภัย `crypto.getRandomValues()` ให้เอนโทรปีจริงที่เหมาะสำหรับ:

- การสร้างโทเค็นความปลอดภัย
- Session IDs
- คีย์ API
- แอปพลิเคชันทางคริปโตกราฟี

### การเปรียบเทียบเวอร์ชัน UUID

| เวอร์ชัน | พื้นฐาน | การชนกัน | การจัดเรียงตามเวลา | ประสิทธิภาพ DB | การใช้งาน |
| --- | --- | --- | --- | --- | --- |
| v1 | Timestamp + MAC | ต่ำ | ✅ ใช่ | ❌ แย่กว่า | รุ่นเก่า, การตรวจสอบ |
| v3 | แฮช MD5 | ไม่มี (กำหนดได้) | ❌ ไม่ | ⚠️ ปานกลาง | การแปลง (รุ่นเก่า) |
| v4 | สุ่ม | ต่ำมาก | ❌ ไม่ | ⚠️ ปานกลาง | การใช้งานทั่วไป |
| v5 | แฮช SHA-1 | ไม่มี (กำหนดได้) | ❌ ไม่ | ⚠️ ปานกลาง | การแปลง (แนะนำ) |
| v6 | Timestamp ที่จัดเรียง | ต่ำ | ✅ ใช่ | ✅ ดีขึ้น | DB ทันสมัยพร้อมเวลา |
| v7 | Unix timestamp | ต่ำ | ✅ ใช่ | ✅ ดีที่สุด | โปรเจกต์ใหม่ |

### UUID เทียบกับตัวระบุอื่นๆ

| ประเภท | ขนาด | การชนกัน | การจัดเรียงตามเวลา | การใช้งาน |
| --- | --- | --- | --- | --- |
| Auto-increment ID | 4-8 ไบต์ | รับประกันความไม่ซ้ำกันในตาราง | ❌ | แอปพลิเคชันง่ายๆ, DB โลคอล |
| UUID v4 | 16 ไบต์ | แทบเป็นไปไม่ได้ | ❌ | ระบบแบบกระจาย, API |
| UUID v7 | 16 ไบต์ | แทบเป็นไปไม่ได้ | ✅ | DB ทันสมัยพร้อมประสิทธิภาพ |
| ULID | 16 ไบต์ | แทบเป็นไปไม่ได้ | ✅ | UUID + การจัดเรียงตามพจนานุกรม |
| Snowflake ID | 8 ไบต์ | รับประกันความไม่ซ้ำกันเมื่อกำหนดค่าถูกต้อง | ✅ | Twitter, ระบบแบบกระจาย |
| NanoID | กำหนดค่าได้ | ขึ้นอยู่กับความยาว | ❌ | ID ที่เป็นมิตรกับ URL |

## การนำไปใช้ในภาษาต่างๆ

### JavaScript/TypeScript

```
// UUID v4 - วิธีที่ง่ายที่สุด (เบราว์เซอร์ที่ทันสมัย)
const uuid = crypto.randomUUID();

// UUID v4 - การนำไปใช้ด้วยตนเอง
function generateUUIDv4() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
    const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
    const v = c === 'x' ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
}

// UUID v7 - แนะนำสำหรับฐานข้อมูล
function generateUUIDv7() {
  const timestamp = Date.now();
  const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
  const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');

  const randomBytes = crypto.getRandomValues(new Uint8Array(10));
  const randomHex = Array.from(randomBytes)
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');

  return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
```

### Python

```
import uuid

# UUID v4
uuid_v4 = str(uuid.uuid4())
# ผลลัพธ์: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'

# UUID v1
uuid_v1 = str(uuid.uuid1())
```

### Java

```
import java.util.UUID;

// UUID v4
String uuidV4 = UUID.randomUUID().toString();
```

### PHP

```
// UUID v4 (PHP 7+)
function generateUUID() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        mt_rand(0, 0xffff),
        mt_rand(0, 0x0fff) | 0x4000,
        mt_rand(0, 0x3fff) | 0x8000,
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}
```

### C#

```
using System;

// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();
```

## แนวทางปฏิบัติที่ดีที่สุด

### การจัดเก็บ UUID ในฐานข้อมูล

**PostgreSQL:**

```
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);
```

**MySQL 8.0+:**

```
CREATE TABLE users (
    id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
    email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

**เคล็ดลับ:** ใน MySQL ควรจัดเก็บ UUID เป็น `BINARY(16)` แทน `CHAR(36)` เพื่อประหยัดพื้นที่และทำดัชนีได้เร็วขึ้น

### การตรวจสอบ UUID

```
function isValidUUID(uuid) {
  const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
  return regex.test(uuid);
}
```

### การแปลง UUID

```
// การลบขีดกลาง
const compact = uuid.replace(/-/g, '');

// การเพิ่มขีดกลางกลับ
function formatUUID(compactUuid) {
  return [
    compactUuid.substring(0, 8),
    compactUuid.substring(8, 12),
    compactUuid.substring(12, 16),
    compactUuid.substring(16, 20),
    compactUuid.substring(20, 32)
  ].join('-');
}
```

## การแก้ไขปัญหา (Troubleshooting)

### UUID v3/v5 ไม่ทำงาน

**ปัญหา:** หลังจากเลือก v3 หรือ v5 แล้ว ไม่มีอะไรถูกสร้างขึ้นมา

**วิธีแก้ไข:**

1. ✅ ตรวจสอบว่าคุณ **ป้อนข้อมูลในช่อง “ชื่อ”** แล้ว - ซึ่งจำเป็น!
2. ✅ เลือก namespace ที่ถูกต้องตามประเภทข้อมูลเข้าของคุณ
3. ✅ ตัวอย่างข้อมูลเข้าที่ถูกต้อง:
   - DNS: `example.com`, `google.com`
   - URL: `https://example.com/page`
   - ข้อความใดๆ: `my-application-v1`

**เคล็ดลับ:** ลองใช้ค่าที่เรียบง่ายเช่น `test` และ namespace เป็น DNS ก่อน

### UUID แบบเวลา (v1, v6, v7) มีเวลาที่แปลกไป

**ปัญหา:** UUID ที่สร้างขึ้นมี timestamp ที่ไม่คาดคิด

**วิธีแก้ไข:**

1. ✅ ตรวจสอบตัวเลือกวันที่-เวลา - ตั้งเวลาถูกต้องหรือไม่?
2. ✅ ตัวเลือกวันที่-เวลาใช้เขตเวลาท้องถิ่นของคุณ
3. ✅ ปล่อยตัวเลือกวันที่-เวลาว่างไว้เพื่อใช้เวลาปัจจุบัน

### ไม่สามารถคัดลอก UUID ได้

**ปัญหา:** ปุ่ม “คัดลอกทั้งหมด” ไม่ทำงาน

**วิธีแก้ไข:**

1. ✅ ตรวจสอบว่าคุณได้สร้าง UUID แล้ว (ไม่ว่างเปล่า)
2. ✅ เบราว์เซอร์บางตัวต้องการ HTTPS สำหรับ clipboard API
3. ✅ อีกทางเลือกหนึ่งคือเลือกข้อความใน textarea แล้วคัดลอกด้วยตนเอง (Ctrl+C)

## คำถามที่พบบ่อย (FAQ)

### UUID สามารถเกิดการชนกันได้หรือไม่?

ตามทฤษฎีแล้วได้ แต่โอกาสนั้นน้อยมากจนแทบจะเป็นไปไม่ได้ หากสร้าง UUID v4 1 พันล้านรายการต่อวินาที เป็นเวลา 100 ปี โอกาสที่จะเกิดการชนกันจะอยู่ที่ประมาณ 0.00000006% ในทางปฏิบัติ การชนกันไม่เคยเกิดขึ้น

### UUID เหมาะสมกับการเป็นคีย์หลักในฐานข้อมูลหรือไม่?

ขึ้นอยู่กับกรณีการใช้งาน UUID เหมาะอย่างยิ่งสำหรับระบบแบบกระจายและสถานการณ์ที่คุณต้องการความเป็นเอกลักษณ์ทั่วโลก สำหรับแอปพลิเคชันง่ายๆ ที่มีฐานข้อมูลเดียว auto-increment อาจมีประสิทธิภาพมากกว่า

### UUID ที่สร้างโดยเครื่องมือนี้ปลอดภัยหรือไม่?

ใช่ เราใช้ Web Crypto API (\`crypto.getRandomValues()\`) ซึ่งให้ค่าสุ่มที่ปลอดภัยทางคริปโตกราฟี ทุกอย่างดำเนินการภายในเบราว์เซอร์ของคุณ

### ความแตกต่างระหว่าง UUID แต่ละเวอร์ชันคืออะไร?

\- \*\*v1\*\*: Timestamp + MAC/สุ่ม - จัดเรียงตามลำดับเวลา, ประสิทธิภาพ DB แย่กว่า - \*\*v3/v5\*\*: อิงตามแฮช - กำหนดได้, สำหรับการแปลงตัวระบุที่รู้จัก - \*\*v4\*\*: สุ่ม - ปลอดภัยที่สุด, ใช้งานมากที่สุด - \*\*v6\*\*: Timestamp ที่จัดเรียงใหม่ - ประสิทธิภาพ DB ดีกว่า v1 - \*\*v7\*\*: Unix timestamp - ประสิทธิภาพ DB ดีที่สุด + การจัดเรียงตามเวลา

### ฉันควรใช้ UUID เวอร์ชันใด?

สำหรับกรณีส่วนใหญ่ ให้ใช้ \*\*v4\*\* (สุ่ม) สำหรับฐานข้อมูลที่มีการจัดเรียงตามเวลา ให้ใช้ \*\*v7\*\* (ทันสมัย) หรือ \*\*v6\*\* (มาตรฐาน) สำหรับการแปลงตัวระบุที่รู้จัก (URL, DNS) ให้ใช้ \*\*v5\*\* (SHA-1)

### ฉันสามารถใช้ UUID สำหรับโทเค็นและคีย์ API ได้หรือไม่?

UUID v4 เหมาะสำหรับ session IDs และโทเค็นที่คล้ายกัน สำหรับคีย์ API ให้พิจารณาใช้สตริงสุ่มที่ยาวกว่า (เช่น ค่า 256 บิต) หรือไลบรารีเฉพาะทาง

### UUID มีขนาดเท่าใด?

UUID มีขนาด 128 บิต (16 ไบต์) ในรูปแบบสตริงที่มีขีดกลางจะใช้ 36 ตัวอักษร หากไม่มีขีดกลางจะใช้ 32 ตัวอักษรฐานสิบหก

## ทางเลือกอื่นสำหรับ UUID

### ULID (Universally Unique Lexicographically Sortable Identifier)

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

**ตัวอย่าง:** `01ARZ3NDEKTSV4RRFFQ69G5FAV`

### NanoID

- ขนาดเล็กกว่า UUID (21 ตัวอักษรโดยมาตรฐาน)
- เป็นมิตรกับ URL (ไม่มีอักขระพิเศษ)
- สร้างได้เร็วกว่า
- กำหนดความยาวและตัวอักษรได้

**ตัวอย่าง:** `V1StGXR8_Z5jdHi6B-myT`

### Snowflake ID (Twitter)

- ID ขนาด 64 บิต (เล็กกว่า UUID)
- สามารถจัดเรียงตามเวลาได้
- มี worker ID และหมายเลขลำดับ
- ต้องมีการกำหนดค่าแบบรวมศูนย์

**ตัวอย่าง:** `1234567890123456789`

## ประสิทธิภาพและการปรับแต่ง

### ความเร็วในการสร้าง

เครื่องสร้างของเราสามารถสร้าง:

- **1 UUID:** < 1 มิลลิวินาที
- **100 UUID:** ~10-20 มิลลิวินาที
- **1000 UUID:** ~100-200 มิลลิวินาที

### เคล็ดลับสำหรับประสิทธิภาพ

1. **การสร้างเป็นชุด** – หากคุณต้องการ UUID จำนวนมาก ให้สร้างพร้อมกันทีเดียวแทนที่จะสร้างทีละรายการ
2. **การจัดเก็บใน DB** – ทำดัชนีคอลัมน์ UUID เพื่อการค้นหาที่รวดเร็ว
3. **การบีบอัด** – จัดเก็บ UUID ในรูปแบบไบนารี (16 ไบต์) แทนสตริง (36 ไบต์)
4. **การแคช** – ในบางกรณี คุณสามารถสร้าง UUID ล่วงหน้าและแคชไว้ได้

## สำหรับนักพัฒนา

### โครงสร้าง UUID v4

```
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|        |    |    |    |
|        |    |    |    └─ 48 บิตของข้อมูลสุ่ม (node)
|        |    |    └────── 16 บิตของข้อมูลสุ่มพร้อมรูปแบบ (clock_seq)
|        |    └─────────── 12 บิตของข้อมูลสุ่ม + 4 บิตของเวอร์ชัน (time_hi_and_version)
|        └──────────────── 16 บิตของข้อมูลสุ่ม (time_mid)
└───────────────────────── 32 บิตของข้อมูลสุ่ม (time_low)
```

- เวอร์ชัน (4 บิต): เสมอ `0100` (ไบนารี) = `4` (เลขฐานสิบหก)
- รูปแบบ (2-3 บิต): เสมอ `10` (ไบนารี) สำหรับ RFC 4122

### การทดสอบ UUID

```
// Jest test
describe('UUID Generator', () => {
  test('สร้าง UUID v4 ที่ถูกต้อง', () => {
    const uuid = generateUUIDv4();
    const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
    expect(regex.test(uuid)).toBe(true);
  });

  test('สร้าง UUID ที่ไม่ซ้ำกัน', () => {
    const uuid1 = generateUUIDv4();
    const uuid2 = generateUUIDv4();
    expect(uuid1).not.toBe(uuid2);
  });
});
```

## ประเด็นด้านความปลอดภัย

### สิ่งที่ไม่ควรทำกับ UUID

❌ **อย่าใช้ UUID v1 สำหรับแอปพลิเคชันที่ละเอียดอ่อน** – เนื่องจากมี timestamp ซึ่งอาจเป็นความเสี่ยงด้านความปลอดภัย

❌ **อย่าใช้ `Math.random()` ในการสร้าง UUID** – เนื่องจากไม่ปลอดภัยทางคริปโตกราฟี

❌ **อย่าพึ่งพา UUID ในการอนุมัติ** – UUID สามารถเดาได้ (แม้ว่าจะมีโอกาสน้อยมากก็ตาม)

❌ **อย่าเก็บ UUID ในคุกกี้โดยไม่มีการเข้ารหัส** – ควรใช้ signed cookies หรือ JWT

### สิ่งที่ควรทำ

✅ **ใช้ UUID v4 สำหรับกรณีส่วนใหญ่** – ให้เอนโทรปีและความปลอดภัยสูงสุด

✅ **ใช้ UUID ร่วมกับมาตรการความปลอดภัยอื่นๆ** – สำหรับการจัดการเซสชัน ให้ใช้ HTTPS, คุกกี้ HttpOnly และกำหนดวันหมดอายุสั้นๆ

✅ **ตรวจสอบ UUID บนเซิร์ฟเวอร์** – ตรวจสอบรูปแบบและเวอร์ชันของ UUID เสมอ

✅ **ใช้แหล่งที่มาของค่าสุ่มที่ปลอดภัยทางคริปโตกราฟี** – `crypto.getRandomValues()` ในเบราว์เซอร์, `/dev/urandom` บน Linux

## ข้อเท็จจริงที่น่าสนใจ

- **จำนวน UUID v4 ที่เป็นไปได้:** 2^122 ≈ 5.3 × 10^36 (340 undecillion)
- **โอกาสชนกัน 50%:** คุณต้องสร้าง UUID 2.71 × 10^18 รายการ (2.71 quintillion) เพื่อให้มีโอกาสชนกัน 50%
- **ขนาดของ UUID ที่เป็นไปได้ทั้งหมด:** หากเราจัดเก็บ UUID แต่ละรายการเป็น 16 ไบต์ พื้นที่ทั้งหมดจะใช้ 85 เซตตะไบต์ (85 พันล้านเทราไบต์)
- **ที่มา:** UUID ได้รับการกำหนดมาตรฐานเป็นส่วนหนึ่งของ DCE (Distributed Computing Environment) ในปี 1990

## Other languages

- Čeština (cs): [Generátor UUID](https://acrafto.com/cs/generator-uuid/) ([Markdown](https://acrafto.com/cs/generator-uuid/index.md))
- Slovenčina (sk): [UUID generátor](https://acrafto.com/sk/generator-uuid/) ([Markdown](https://acrafto.com/sk/generator-uuid/index.md))
- English (en): [UUID Generator](https://acrafto.com/en/uuid-generator/) ([Markdown](https://acrafto.com/en/uuid-generator/index.md))
- Deutsch (de): [UUID Generator](https://acrafto.com/de/uuid-generator/) ([Markdown](https://acrafto.com/de/uuid-generator/index.md))
- Français (fr): [Générateur UUID](https://acrafto.com/fr/generateur-uuid/) ([Markdown](https://acrafto.com/fr/generateur-uuid/index.md))
- Español (es): [Generador de UUID](https://acrafto.com/es/generador-uuid/) ([Markdown](https://acrafto.com/es/generador-uuid/index.md))
- Italiano (it): [Generatore UUID](https://acrafto.com/it/generatore-uuid/) ([Markdown](https://acrafto.com/it/generatore-uuid/index.md))
- Português (pt): [Gerador de UUID](https://acrafto.com/pt/gerador-uuid/) ([Markdown](https://acrafto.com/pt/gerador-uuid/index.md))
- Nederlands (nl): [UUID generator](https://acrafto.com/nl/uuid-generator/) ([Markdown](https://acrafto.com/nl/uuid-generator/index.md))
- Polski (pl): [Generator UUID](https://acrafto.com/pl/generator-uuid/) ([Markdown](https://acrafto.com/pl/generator-uuid/index.md))
- Română (ro): [Generator UUID](https://acrafto.com/ro/generator-uuid/) ([Markdown](https://acrafto.com/ro/generator-uuid/index.md))
- Magyar (hu): [UUID generátor](https://acrafto.com/hu/uuid-generator/) ([Markdown](https://acrafto.com/hu/uuid-generator/index.md))
- Ελληνικά (el): [Γεννήτρια UUID](https://acrafto.com/el/gennitria-uuid/) ([Markdown](https://acrafto.com/el/gennitria-uuid/index.md))
- Български (bg): [UUID генератор](https://acrafto.com/bg/uuid-generator/) ([Markdown](https://acrafto.com/bg/uuid-generator/index.md))
- Hrvatski (hr): [Generator UUID](https://acrafto.com/hr/generator-uuid/) ([Markdown](https://acrafto.com/hr/generator-uuid/index.md))
- Slovenščina (sl): [UUID generator](https://acrafto.com/sl/generator-uuid/) ([Markdown](https://acrafto.com/sl/generator-uuid/index.md))
- Eesti (et): [UUID generaator](https://acrafto.com/et/uuid-generaator/) ([Markdown](https://acrafto.com/et/uuid-generaator/index.md))
- Latviešu (lv): [UUID ģenerators](https://acrafto.com/lv/uuid-generator/) ([Markdown](https://acrafto.com/lv/uuid-generator/index.md))
- Lietuvių (lt): [UUID generatorius](https://acrafto.com/lt/uuid-generatorius/) ([Markdown](https://acrafto.com/lt/uuid-generatorius/index.md))
- Svenska (sv): [UUID-generator](https://acrafto.com/sv/uuid-generator/) ([Markdown](https://acrafto.com/sv/uuid-generator/index.md))
- Dansk (da): [UUID generator](https://acrafto.com/da/uuid-generator/) ([Markdown](https://acrafto.com/da/uuid-generator/index.md))
- Suomi (fi): [UUID-generaattori](https://acrafto.com/fi/uuid-generaattori/) ([Markdown](https://acrafto.com/fi/uuid-generaattori/index.md))
- Norsk (no): [UUID-generator](https://acrafto.com/no/uuid-generator/) ([Markdown](https://acrafto.com/no/uuid-generator/index.md))
- Українська (uk): [Генератор UUID](https://acrafto.com/uk/henerator-uuid/) ([Markdown](https://acrafto.com/uk/henerator-uuid/index.md))
- Русский (ru): [Генератор UUID](https://acrafto.com/ru/generator-uuid/) ([Markdown](https://acrafto.com/ru/generator-uuid/index.md))
- Српски (sr): [UUID generator](https://acrafto.com/sr/uuid-generator/) ([Markdown](https://acrafto.com/sr/uuid-generator/index.md))
- Македонски (mk): [UUID генератор](https://acrafto.com/mk/uuid-generator/) ([Markdown](https://acrafto.com/mk/uuid-generator/index.md))
- Bosanski (bs): [Generator UUID-a](https://acrafto.com/bs/generator-uuid/) ([Markdown](https://acrafto.com/bs/generator-uuid/index.md))
- Shqip (sq): [Gjenerator UUID](https://acrafto.com/sq/gjenerator-uuid/) ([Markdown](https://acrafto.com/sq/gjenerator-uuid/index.md))
- Türkçe (tr): [UUID oluşturucu](https://acrafto.com/tr/uuid-uretici/) ([Markdown](https://acrafto.com/tr/uuid-uretici/index.md))
- 日本語 (ja): [UUID生成ツール](https://acrafto.com/ja/uuid-generator/) ([Markdown](https://acrafto.com/ja/uuid-generator/index.md))
- 한국어 (ko): [UUID 생성기](https://acrafto.com/ko/uuid-generator/) ([Markdown](https://acrafto.com/ko/uuid-generator/index.md))
- العربية (ar): [مولد UUID](https://acrafto.com/ar/uuid-generator/) ([Markdown](https://acrafto.com/ar/uuid-generator/index.md))
- हिन्दी (hi): [UUID जनरेटर](https://acrafto.com/hi/uuid-generator/) ([Markdown](https://acrafto.com/hi/uuid-generator/index.md))
- Bahasa Indonesia (id): [Generator UUID](https://acrafto.com/id/generator-uuid/) ([Markdown](https://acrafto.com/id/generator-uuid/index.md))
- Tiếng Việt (vi): [Trình tạo UUID](https://acrafto.com/vi/uuid-generator/) ([Markdown](https://acrafto.com/vi/uuid-generator/index.md))
- עברית (he): [מחולל UUID](https://acrafto.com/he/uuid-generator/) ([Markdown](https://acrafto.com/he/uuid-generator/index.md))
