Trình tạo UUID trực tuyến miễn phí (v1, v3-v7) - Tạo hàng loạt

UUID là gì?

UUID (Universally Unique Identifier) là một định danh 128 bit được sử dụng trong các hệ thống máy tính để nhận dạng thông tin một cách duy nhất. UUID được tiêu chuẩn hóa theo RFC 4122 và nhờ entropy khổng lồ của nó, đảm bảo xác suất va chạm gần như bằng không – điều này có nghĩa là hai UUID được tạo độc lập gần như chắc chắn sẽ là duy nhất.

UUID có định dạng chuẩn: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, trong đó mỗi x là một chữ số thập lục phân (0-9, a-f), M biểu thị phiên bản UUID và N biểu thị biến thể.

Các phiên bản UUID

UUID v1 (Dấu thời gian + Địa chỉ MAC)

UUID v1 dựa trên dấu thời gian hiện tại và một giá trị ngẫu nhiên (trong trình duyệt thay vì địa chỉ MAC). Nó sử dụng các khoảng thời gian 100 nanosecond kể từ ngày 15 tháng 10 năm 1582 (lịch Gregorian).

Trường hợp sử dụng:

  • Các tình huống bạn cần sắp xếp UUID theo thời gian
  • Gỡ lỗi và ghi log (UUID chứa thông tin thời gian tạo)
  • Các hệ thống phân tán với đồng bộ hóa thời gian

Ví dụ: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

Ưu điểm:

  • UUID có thể được sắp xếp theo thời gian tạo
  • Hữu ích cho kiểm toán và gỡ lỗi
  • Chứa thông tin dấu thời gian

Nhược điểm:

  • Rủi ro bảo mật tiềm ẩn – chứa dấu thời gian
  • Trong trình duyệt không chứa địa chỉ MAC thực tế (được thay thế bằng giá trị ngẫu nhiên)
  • Vị trí DB kém (dấu thời gian nằm trong các bit thứ tự thấp hơn)

UUID v3 (Băm MD5)

UUID v3 được tạo bằng cách sử dụng băm MD5 của UUID không gian tên và tên. Xác định – cùng một không gian tên + tên luôn tạo ra cùng một UUID.

Trường hợp sử dụng:

  • Chuyển đổi URL, tên DNS hoặc các định danh khác thành UUID
  • Các tình huống bạn cần UUID có thể tái tạo
  • Ánh xạ giữa các hệ thống nhận dạng khác nhau

Ví dụ: a3bb189e-8bf9-3888-9912-ace4e6543002

Ưu điểm:

  • Xác định (cùng đầu vào = cùng đầu ra)
  • Lý tưởng để chuyển đổi các định danh đã biết
  • Không có va chạm cho các đầu vào khác nhau

Nhược điểm:

  • MD5 là một thuật toán lỗi thời (ưu tiên v5)
  • Yêu cầu không gian tên và tên
  • Không thể khôi phục đầu vào ban đầu

UUID v4 (Ngẫu nhiên) - KHUYÊN DÙNG

Phiên bản UUID được sử dụng phổ biến nhất. UUID v4 được tạo hoàn toàn ngẫu nhiên bằng cách sử dụng trình tạo số ngẫu nhiên an toàn mật mã (crypto.getRandomValues()).

Trường hợp sử dụng:

  • Khóa chính cơ sở dữ liệu
  • Định danh phiên (Session IDs)
  • Tên tệp duy nhất
  • Mã thông báo API
  • Mục đích chung khi bạn cần một ID duy nhất được đảm bảo

Ví dụ: f47ac10b-58cc-4372-a567-0e02b2c3d479

Ưu điểm:

  • Entropy và bảo mật tối đa
  • Không phụ thuộc vào thời gian hoặc các tham số hệ thống
  • Triển khai đơn giản nhất

Xác suất va chạm: Khi tạo 1 tỷ UUID mỗi giây trong 100 năm, khả năng va chạm xấp xỉ 0,00000006%.

UUID v5 (Băm SHA-1)

UUID v5 giống như v3, nhưng sử dụng SHA-1 thay vì MD5. Một giải pháp thay thế hiện đại và an toàn hơn cho v3.

Trường hợp sử dụng:

  • Tương tự như v3, nhưng với bảo mật tốt hơn
  • Được ưu tiên hơn v3 cho các dự án mới
  • Tạo UUID từ URL, tên DNS, OID, X.500 DN

Ví dụ: 886313e1-3b8a-5372-9b90-0c9aee199e5d

Ưu điểm:

  • Xác định
  • SHA-1 mạnh mẽ hơn MD5
  • Thích hợp cho việc ánh xạ giữa các hệ thống

Nhược điểm:

  • SHA-1 cũng được coi là lỗi thời (nhưng vẫn an toàn hơn MD5)
  • Yêu cầu không gian tên và tên

UUID v6 (Dấu thời gian được sắp xếp)

UUID v6 là một phiên bản cải tiến của v1 với các bit thời gian được sắp xếp lại để lập chỉ mục cơ sở dữ liệu tốt hơn. Được thiết kế để giải quyết các vấn đề về vị trí trong cơ sở dữ liệu.

Trường hợp sử dụng:

  • Khóa chính cơ sở dữ liệu có sắp xếp theo thời gian
  • Các hệ thống yêu cầu sắp xếp theo thời gian và hiệu suất DB
  • Một giải pháp thay thế hiện đại hơn cho v1

Ví dụ: 1ec9414c-232a-6b00-b3c8-9e6bdeced846

Ưu điểm:

  • Vị trí DB tốt hơn v1 (dấu thời gian nằm trong các bit thứ tự cao hơn)
  • Sắp xếp theo thời gian
  • Tương thích với tiêu chuẩn UUID

Nhược điểm:

  • Ít được sử dụng hơn v1/v4
  • Vẫn chứa thông tin thời gian (rủi ro bảo mật)

UUID v7 (Dấu thời gian Unix)

UUID v7 sử dụng dấu thời gian Unix (mili giây từ năm 1970) + các bit ngẫu nhiên. Phiên bản UUID mới nhất với vị trí DB tốt nhất.

Trường hợp sử dụng:

  • Khóa chính cơ sở dữ liệu hiện đại
  • Các hệ thống yêu cầu hiệu suất + sắp xếp theo thời gian
  • Thay thế cho v1/v6 trong các dự án mới

Ví dụ: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f

Ưu điểm:

  • Vị trí DB tốt nhất trong tất cả các phiên bản
  • Dấu thời gian Unix là tiêu chuẩn
  • Kết hợp lợi ích của tính ngẫu nhiên và sắp xếp theo thời gian

Nhược điểm:

  • Đặc tả tương đối mới (RFC 4122bis)
  • Ít được hỗ trợ hơn trong các hệ thống cũ

Nên sử dụng phiên bản UUID nào?

Hướng dẫn lựa chọn

Bạn cần bảo mật và tính ngẫu nhiên tối đa? → Sử dụng UUID v4 (lựa chọn phổ biến nhất)

Bạn cần sắp xếp theo thời gian và hiệu suất DB? → Sử dụng UUID v7 (hiện đại) hoặc UUID v6 (tiêu chuẩn)

Bạn cần UUID có thể tái tạo từ các định danh hiện có? → Sử dụng UUID v5 (SHA-1) hoặc UUID v3 (MD5, lỗi thời)

Bạn cần dấu thời gian và nhật ký kiểm toán? → Sử dụng UUID v1 (lỗi thời, hiệu suất DB kém hơn)

Cơ sở dữ liệu

Đối với các dự án mới: UUID v7 hoặc v4

  • v7 lý tưởng cho việc sắp xếp theo thời gian + hiệu suất
  • v4 cho tính ngẫu nhiên tối đa mà không có thông tin thời gian

Đối với các hệ thống cũ: UUID v1 hoặc v6

  • v6 có vị trí DB tốt hơn v1
  • v1 được hỗ trợ rộng rãi

Ưu điểm của UUID làm khóa chính:

  • Tính duy nhất toàn cầu – Bạn có thể kết nối dữ liệu từ các cơ sở dữ liệu khác nhau mà không bị xung đột
  • Bảo mật – Không giống như ID tuần tự (1, 2, 3…), không thể đoán được các giá trị tiếp theo
  • Hệ thống phân tán – UUID có thể được tạo độc lập trên nhiều máy chủ mà không cần phối hợp
  • Hợp nhất cơ sở dữ liệu – Khi hợp nhất hai cơ sở dữ liệu, không phát sinh xung đột

Nhược điểm:

  • Kích thước lớn hơn (16 byte so với 4-8 byte cho số nguyên)
  • Lập chỉ mục chậm hơn trong một số cơ sở dữ liệu (sử dụng v6/v7 để có hiệu suất tốt hơn)
  • Ít dễ đọc hơn đối với con người

API và Dịch vụ Web

  • REST API – Định danh duy nhất cho tài nguyên
  • GraphQL – Định danh toàn cầu cho các node
  • Webhook – Theo dõi yêu cầu và phản hồi
  • Mã thông báo – ID phiên, mã thông báo làm mới

Tệp và Bộ nhớ

  • Tên tệp – Ngăn ngừa xung đột khi tải lên
  • S3/Lưu trữ đám mây – Đường dẫn duy nhất đến các đối tượng
  • Khóa bộ nhớ cache – Định danh trong các hệ thống bộ nhớ cache

Ứng dụng Frontend

  • Các thành phần React/Vue – Khóa duy nhất cho các danh sách
  • ID tạm thời – ID trước khi lưu vào cơ sở dữ liệu
  • Bộ nhớ cục bộ – Khóa cho dữ liệu đã lưu trữ
  • Ứng dụng ưu tiên ngoại tuyến – Tạo ID mà không cần kết nối với máy chủ

Tính năng nâng cao của trình tạo

Tạo UUID với dấu thời gian tùy chỉnh

Đối với các phiên bản dựa trên thời gian (v1, v6, v7), bạn có thể chọn bất kỳ dấu thời gian nào bằng cách sử dụng bộ chọn ngày-giờ. Điều này hữu ích cho:

Kiểm thử:

  • Mô phỏng UUID được tạo trong quá khứ
  • Kiểm thử sắp xếp theo thời gian trong cơ sở dữ liệu
  • Tái tạo UUID để gỡ lỗi

Di chuyển dữ liệu:

  • Tạo UUID với các dấu thời gian lịch sử
  • Điền lại dữ liệu với các giá trị dấu thời gian chính xác
  • Nhập dữ liệu từ các khoảng thời gian khác nhau

Kiểm toán và Tuân thủ:

  • Tái tạo UUID theo thời gian tạo bản ghi
  • Tạo định danh hồi tố

Ví dụ sử dụng:

  1. Chọn phiên bản v1, v6 hoặc v7
  2. Đặt ngày và giờ bằng cách sử dụng bộ chọn ngày-giờ
  3. Tạo UUID với dấu thời gian tùy chỉnh của bạn

UUID dựa trên hàm băm (v3, v5)

Đối với UUID xác định, bạn có thể sử dụng các phiên bản v3 (MD5) hoặc v5 (SHA-1):

Cách sử dụng:

  1. Chọn không gian tên theo loại định danh của bạn
  2. Nhập tên/giá trị
  3. Tạo UUID

Ví dụ:

Không gian tênTên (đầu vào)Trường hợp sử dụng
DNSexample.comChuyển đổi tên miền thành UUID
DNSgoogle.comMỗi trang web có một UUID duy nhất
URLhttps://example.com/pageChuyển đổi URL thành UUID
URLhttps://api.example.com/users/123Điểm cuối API dưới dạng UUID
OID1.3.6.1.4.1.343Định danh đối tượng thành UUID
X.500CN=John Doe,O=CompanyTên phân biệt thành UUID

Đặc điểm quan trọng:

  • Xác định: Cùng đầu vào = luôn cùng một UUID
  • Có thể tái tạo: Bạn có thể tạo lại UUID bất cứ lúc nào
  • Nhất quán: Cùng một UUID trên các hệ thống khác nhau
  • Không thể giải mã: Không thể lấy lại tên gốc từ UUID
  • ℹ️ Một UUID: Đối với v3/v5, chỉ một UUID được tạo (cùng đầu vào = cùng đầu ra)

Ứng dụng thực tế:

// Ví dụ: Chuyển đổi URL thành UUID v5
Namespace: URL
Tên: https://example.com/api/users/123
Kết quả: 886313e1-3b8a-5372-9b90-0c9aee199e5d

// Cùng đầu vào = luôn cùng một UUID
Namespace: DNS
Tên: google.com
Kết quả: luôn cùng một UUID cho google.com

Cách sử dụng UUID an toàn?

Bảo mật mật mã

Trình tạo của chúng tôi sử dụng crypto.getRandomValues(), là một trình tạo số ngẫu nhiên an toàn mật mã. Không giống như Math.random(), có thể dự đoán được và không phù hợp cho mục đích bảo mật, crypto.getRandomValues() cung cấp entropy thực sự phù hợp cho:

  • Tạo mã thông báo bảo mật
  • ID phiên
  • Khóa API
  • Các ứng dụng mật mã

So sánh các phiên bản UUID

Phiên bảnCơ sởVa chạmSắp xếp theo thời gianHiệu suất DBTrường hợp sử dụng
v1Dấu thời gian + MACThấp✅ Có❌ Kém hơnLỗi thời, kiểm toán
v3Băm MD5Không (xác định)❌ Không⚠️ Trung bìnhChuyển đổi (lỗi thời)
v4Ngẫu nhiênCực kỳ thấp❌ Không⚠️ Trung bìnhMục đích chung
v5Băm SHA-1Không (xác định)❌ Không⚠️ Trung bìnhChuyển đổi (khuyên dùng)
v6Dấu thời gian được sắp xếpThấp✅ Có✅ Tốt hơnDB hiện đại với thời gian
v7Dấu thời gian UnixThấp✅ Có✅ Tốt nhấtCác dự án mới

UUID so với các định danh khác

LoạiKích thướcVa chạmSắp xếp theo thời gianTrường hợp sử dụng
Auto-increment ID4-8 byteĐảm bảo duy nhất trong bảngỨng dụng đơn giản, DB cục bộ
UUID v416 byteHầu như không thểHệ thống phân tán, API
UUID v716 byteHầu như không thểDB hiện đại với hiệu suất
ULID16 byteHầu như không thểUUID + sắp xếp theo từ điển
Snowflake ID8 byteĐảm bảo duy nhất khi cấu hình đúngTwitter, hệ thống phân tán
NanoIDCó thể cấu hìnhPhụ thuộc vào độ dàiID thân thiện với URL

Triển khai trong các ngôn ngữ khác nhau

JavaScript/TypeScript

// UUID v4 - Cách đơn giản nhất (trình duyệt hiện đại)
const uuid = crypto.randomUUID();

// UUID v4 - Triển khai thủ công
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 - Khuyên dùng cho cơ sở dữ liệu
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())
# Output: '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();

Các phương pháp hay nhất

Lưu trữ UUID trong cơ sở dữ liệu

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
);

Mẹo: Trong MySQL, hãy lưu trữ UUID dưới dạng BINARY(16) thay vì CHAR(36) để tiết kiệm không gian và lập chỉ mục nhanh hơn.

Xác thực 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);
}

Chuyển đổi UUID

// Xóa dấu gạch ngang
const compact = uuid.replace(/-/g, '');

// Thêm lại dấu gạch ngang
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('-');
}

Khắc phục sự cố (Troubleshooting)

UUID v3/v5 không hoạt động

Vấn đề: Sau khi chọn v3 hoặc v5, không có gì được tạo

Giải pháp:

  1. ✅ Kiểm tra xem bạn đã điền vào trường “Tên” chưa - đây là trường bắt buộc!
  2. ✅ Chọn không gian tên phù hợp với loại đầu vào của bạn
  3. ✅ Ví dụ về các đầu vào hợp lệ:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • Bất kỳ văn bản nào: moje-aplikace-v1

Mẹo: Hãy thử một giá trị đơn giản như test và không gian tên DNS trước.

UUID dựa trên thời gian (v1, v6, v7) có thời gian lạ

Vấn đề: UUID được tạo có dấu thời gian không mong muốn

Giải pháp:

  1. ✅ Kiểm tra bộ chọn ngày-giờ - thời gian có được đặt đúng không?
  2. ✅ Bộ chọn ngày-giờ sử dụng múi giờ cục bộ của bạn
  3. ✅ Để trống bộ chọn ngày-giờ để sử dụng thời gian hiện tại

Không thể sao chép UUID

Vấn đề: Nút “Sao chép tất cả” không hoạt động

Giải pháp:

  1. ✅ Kiểm tra xem bạn đã tạo UUID chưa (không bị trống)
  2. ✅ Một số trình duyệt yêu cầu HTTPS cho API bảng tạm
  3. ✅ Thay vào đó, chọn văn bản trong textarea và sao chép thủ công (Ctrl+C)

Câu hỏi thường gặp (FAQ)

UUID có thể bị va chạm không? Trên lý thuyết là có, nhưng xác suất cực kỳ nhỏ. Khi tạo 1 tỷ UUID v4 mỗi giây trong 100 năm, khả năng va chạm xấp xỉ 0,00000006%. Trong thực tế, va chạm không bao giờ xảy ra.
UUID có phù hợp làm khóa chính trong cơ sở dữ liệu không? Tùy thuộc vào trường hợp sử dụng. UUID lý tưởng cho các hệ thống phân tán và các tình huống bạn cần tính duy nhất toàn cầu. Đối với các ứng dụng đơn giản với một cơ sở dữ liệu, ID tự động tăng có thể hiệu quả hơn.
Các UUID được tạo bởi công cụ này có an toàn không? Có, chúng tôi sử dụng Web Crypto API (`crypto.getRandomValues()`), cung cấp các giá trị ngẫu nhiên an toàn mật mã. Mọi thứ đều diễn ra cục bộ trong trình duyệt của bạn.
Sự khác biệt giữa các phiên bản UUID là gì? - **v1**: Dấu thời gian + MAC/ngẫu nhiên - sắp xếp theo thời gian, hiệu suất DB kém hơn - **v3/v5**: Dựa trên hàm băm - xác định, để chuyển đổi các định danh đã biết - **v4**: Ngẫu nhiên - an toàn nhất, được sử dụng phổ biến nhất - **v6**: Dấu thời gian được sắp xếp lại - hiệu suất DB tốt hơn v1 - **v7**: Dấu thời gian Unix - hiệu suất DB tốt nhất + sắp xếp theo thời gian
Tôi nên sử dụng phiên bản UUID nào? Đối với hầu hết các trường hợp, hãy sử dụng **v4** (ngẫu nhiên). Đối với cơ sở dữ liệu có sắp xếp theo thời gian, hãy sử dụng **v7** (hiện đại) hoặc **v6** (tiêu chuẩn). Để chuyển đổi các định danh đã biết (URL, DNS), hãy sử dụng **v5** (SHA-1).
Tôi có thể sử dụng UUID cho mã thông báo và khóa API không? UUID v4 phù hợp cho ID phiên và các mã thông báo tương tự. Đối với khóa API, hãy cân nhắc sử dụng các chuỗi ngẫu nhiên dài hơn (ví dụ: giá trị 256 bit) hoặc các thư viện chuyên biệt.
UUID có kích thước bao nhiêu? UUID có 128 bit (16 byte). Ở định dạng chuỗi có dấu gạch ngang, nó chiếm 36 ký tự. Không có dấu gạch ngang là 32 ký tự thập lục phân.

Các giải pháp thay thế cho UUID

ULID (Universally Unique Lexicographically Sortable Identifier)

  • ID 128 bit (giống như UUID)
  • Có thể sắp xếp theo từ điển theo thời gian tạo
  • Đại diện gọn hơn (26 ký tự thay vì 36)
  • Mã hóa base32 không phân biệt chữ hoa chữ thường

Ví dụ: 01ARZ3NDEKTSV4RRFFQ69G5FAV

NanoID

  • Kích thước nhỏ hơn UUID (chuẩn là 21 ký tự)
  • Thân thiện với URL (không có ký tự đặc biệt)
  • Tạo nhanh hơn
  • Độ dài và bảng chữ cái có thể cấu hình

Ví dụ: V1StGXR8_Z5jdHi6B-myT

Snowflake ID (Twitter)

  • ID 64 bit (nhỏ hơn UUID)
  • Có thể sắp xếp theo thời gian
  • Chứa ID worker và số thứ tự
  • Yêu cầu cấu hình tập trung

Ví dụ: 1234567890123456789

Hiệu suất và tối ưu hóa

Tốc độ tạo

Trình tạo của chúng tôi có thể tạo:

  • 1 UUID: < 1 ms
  • 100 UUID: ~10-20 ms
  • 1000 UUID: ~100-200 ms

Mẹo tối ưu hóa hiệu suất

  1. Tạo hàng loạt – Nếu bạn cần nhiều UUID, hãy tạo chúng cùng lúc thay vì từng cái một
  2. Lưu trữ trong DB – Lập chỉ mục các cột UUID để tìm kiếm nhanh
  3. Nén – Lưu trữ UUID ở dạng nhị phân (16 byte) thay vì chuỗi (36 byte)
  4. Bộ nhớ đệm – Trong một số trường hợp, bạn có thể tạo trước và lưu vào bộ nhớ đệm UUID

Dành cho nhà phát triển

Cấu trúc UUID v4

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|        |    |    |    |
|        |    |    |    └─ 48 bit dữ liệu ngẫu nhiên (node)
|        |    |    └────── 16 bit dữ liệu ngẫu nhiên với biến thể (clock_seq)
|        |    └─────────── 12 bit dữ liệu ngẫu nhiên + 4 bit phiên bản (time_hi_and_version)
|        └──────────────── 16 bit dữ liệu ngẫu nhiên (time_mid)
└───────────────────────── 32 bit dữ liệu ngẫu nhiên (time_low)
  • Phiên bản (4 bit): luôn 0100 (nhị phân) = 4 (hệ thập lục phân)
  • Biến thể (2-3 bit): luôn 10 (nhị phân) cho RFC 4122

Kiểm thử UUID

// Jest test
describe('UUID Generator', () => {
  test('generates valid 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('generates unique UUIDs', () => {
    const uuid1 = generateUUIDv4();
    const uuid2 = generateUUIDv4();
    expect(uuid1).not.toBe(uuid2);
  });
});

Các khía cạnh bảo mật

Những điều không nên làm với UUID

Không sử dụng UUID v1 cho các ứng dụng nhạy cảm – Nó chứa dấu thời gian, có thể là rủi ro bảo mật

Không sử dụng Math.random() để tạo UUID – Nó không an toàn mật mã

Không dựa vào UUID để ủy quyền – UUID có thể bị đoán (mặc dù với xác suất cực kỳ nhỏ)

Không lưu trữ UUID trong cookie mà không mã hóa – Sử dụng cookie đã ký hoặc JWT

Những điều nên làm

Sử dụng UUID v4 cho hầu hết các trường hợp – Entropy và bảo mật cao nhất

Kết hợp UUID với các biện pháp bảo mật khác – Để quản lý phiên, sử dụng HTTPS, cookie HttpOnly và thời gian hết hạn ngắn

Xác thực UUID trên máy chủ – Luôn kiểm tra định dạng và phiên bản UUID

Sử dụng các nguồn ngẫu nhiên an toàn mật mãcrypto.getRandomValues() trong trình duyệt, /dev/urandom trên Linux

Sự thật thú vị

  • Số lượng UUID v4 khả dĩ: 2^122 ≈ 5.3 × 10^36 (340 undecillion)
  • Va chạm cần thiết: Để có 50% khả năng va chạm, bạn phải tạo 2.71 × 10^18 UUID (2.71 quintillion)
  • Kích thước của tất cả các UUID khả dĩ: Nếu chúng ta lưu trữ mỗi UUID dưới dạng 16 byte, toàn bộ không gian sẽ chiếm 85 zettabyte (85 tỷ terabyte)
  • Nguồn gốc: UUID được tiêu chuẩn hóa như một phần của DCE (Distributed Computing Environment) vào năm 1990