Chuyển đến nội dung

Trình Tạo UUID Miễn Phí - Tạo UUID V1 & V4 Ngay Lập Tức

Tạo các định danh duy nhất ngay lập tức với trình tạo UUID miễn phí của chúng tôi. Tạo UUID Phiên Bản 1 (dựa trên thời gian) và UUID Phiên Bản 4 (ngẫu nhiên) cho cơ sở dữ liệu, API và hệ thống phân tán.

Trình tạo UUID

Phiên bản UUID
UUID đã tạo
Máy tính tải...
📚

Tài liệu hướng dẫn

Trình tạo UUID

Trình tạo UUID là công cụ tạo ra Mã định danh duy nhất trên toàn cầu, hay UUID: một mã 128 bit dùng để gắn nhãn cho một mẩu dữ liệu để không có mục nào khác ở bất kỳ đâu có khả năng dùng cùng nhãn đó. Trang này tạo UUID Phiên bản 1 (dựa trên thời gian) và Phiên bản 4 (ngẫu nhiên).

UUID là gì?

UUID là một số 128 bit được viết dưới dạng 32 chữ số thập lục phân (các ký tự 0–9 và a-f). Số này được chia thành năm nhóm, ngăn cách bằng dấu gạch ngang, theo mẫu 8-4-4-4-12, tổng cộng 36 ký tự. Một UUID mẫu có dạng như sau:

1550e8400-e29b-41d4-a716-446655440000
2

UUID được định nghĩa trong RFC 9562, do Lực lượng Đặc nhiệm Kỹ thuật Internet công bố vào tháng Năm năm 2024, thay thế RFC cũ hơn 4122 từ năm 2005. Cả hai tài liệu đều mô tả cùng một định dạng 128 bit. Phần mềm dùng UUID để nhận diện các hàng trong cơ sở dữ liệu, tệp, phiên người dùng và các bản ghi khác mà không cần cơ quan trung tâm cấp số. Vì không gian các UUID khả dĩ rất lớn, hai máy tính có thể độc lập tạo UUID cùng lúc mà hầu như không bao giờ tạo ra cùng một UUID.

Định dạng và cấu trúc UUID

128 bit của UUID được chia thành các trường có tên. Mỗi trường chiếm một số bit cố định:

  • time_low - 32 bit
  • time_mid - 16 bit
  • time_hi_and_version - 16 bit
  • clock_seq_hi_and_reserved - 8 bit
  • clock_seq_low - 8 bit
  • node - 48 bit
Bố cục các trường UUID time_low time_mid time_hi seq_hi seq_lo node time_low: 32 bits time_mid: 16 bits time_hi_and_version: 16 bits clock_seq_hi_and_reserved: 8 bits clock_seq_low: 8 bits node: 48 bits

Bốn bit bên trong time_hi_and_version chứa số phiên bản của UUID, còn hai bit bên trong clock_seq_hi_and_reserved chứa biến thể, cho phần mềm biết cách đọc các trường còn lại. Có tám phiên bản được định nghĩa.

Tên các trường trên bắt nguồn từ Phiên bản 1, trong đó chúng thực sự chứa giá trị thời gian và giá trị nút. Các phiên bản khác giữ nguyên bố cục 8-4-4-4-12 và ranh giới trường, nhưng điền phần lớn các bit bằng dữ liệu ngẫu nhiên. Trong UUID Phiên bản 4, nhóm có nhãn time_low là ngẫu nhiên, không phải thời gian.

Cách tạo UUID bằng công cụ này

  1. Chọn một phiên bản: Phiên bản 1 (dựa trên thời gian) hoặc Phiên bản 4 (ngẫu nhiên).
  2. Đọc UUID trong ô kết quả. UUID mới xuất hiện ngay khi trang tải xong hoặc khi phiên bản thay đổi.
  3. Chọn "Generate" để tạo một UUID khác.
  4. Chọn "Copy" để sao chép kết quả vào bộ nhớ tạm, sau đó dán vào mã, cơ sở dữ liệu hoặc tệp cấu hình.

Bảng bên dưới kết quả chia UUID thành năm trường và đặt tên cho từng trường, giúp dễ tìm chữ số phiên bản và chữ số biến thể.

Phiên bản 4 phù hợp với hầu hết công việc, gồm cả khóa cơ sở dữ liệu và mã thông báo phiên, vì nó không chứa thông tin về thời điểm hoặc nơi tạo ra UUID. Phiên bản 1 phù hợp với các bản ghi cần khôi phục thời điểm tạo từ chính mã định danh, chẳng hạn các mục nhật ký.

UUID Phiên bản 1 và Phiên bản 4

Phiên bản 1 mã hóa dấu thời gian hiện tại cùng một chuỗi đồng hồ và giá trị nút được chọn ngẫu nhiên. Tiêu chuẩn cho phép giá trị nút là địa chỉ mạng thực (MAC) của máy tính, nhưng cũng cho phép dùng giá trị nút được tạo ngẫu nhiên để bảo vệ quyền riêng tư. Công cụ này luôn dùng tùy chọn ngẫu nhiên: UUID Phiên bản 1 không bao giờ đọc hoặc để lộ địa chỉ MAC thực. Tiêu chuẩn cũng yêu cầu bit thấp nhất của byte đầu tiên trong trường nút phải được đặt thành 1 đối với giá trị nút ngẫu nhiên, và công cụ này đặt bit đó. Các card mạng thực không bao giờ có bit này, nên không thể nhầm nút ngẫu nhiên với nút thực. Vì vậy, chữ số thập lục phân thứ hai của nhóm thứ năm luôn là số lẻ trong UUID Phiên bản 1 từ trang này: 1, 3, 5, 7, 9, b, d hoặc f.

Có thể đọc lại dấu thời gian bên trong UUID Phiên bản 1, nhờ đó sắp xếp các bản ghi theo thứ tự tạo. Việc sắp xếp chính văn bản UUID không làm được điều đó, vì nhóm đầu tiên chứa 32 bit thấp nhất của dấu thời gian và bị quay vòng khoảng mỗi 7 phút. Phiên bản 6, được bổ sung trong RFC 9562, lưu cùng dấu thời gian nhưng đặt các bit cao nhất trước, để có thể sắp xếp văn bản thông thường.

Phiên bản 4 được tạo từ các bit ngẫu nhiên, với một vài bit cố định để đánh dấu phiên bản và biến thể. Nó không chứa dấu thời gian hay dữ liệu riêng của máy, nên không tiết lộ thời điểm hoặc nơi tạo ra UUID. Không thể sắp xếp nó theo thứ tự tạo.

Sáu phiên bản khác tồn tại trong tiêu chuẩn nhưng không được công cụ này tạo ra: Phiên bản 2 (DCE Security, hiếm dùng); Phiên bản 3 và 5, được tạo bằng cách băm một không gian tên và tên bằng MD5 hoặc SHA-1, nên cùng một đầu vào luôn tạo ra cùng một UUID; và các Phiên bản 6, 7 và 8, được RFC 9562 bổ sung vào năm 2024 cho các mã định danh có thể sắp xếp và mã định danh tùy chỉnh.

Cách tính UUID (công thức)

Phiên bản 4:

  1. Tạo 128 bit ngẫu nhiên.
  2. Đặt bốn bit phiên bản, tức chữ số thập lục phân đầu tiên của nhóm thứ ba, thành 0100 (thập lục phân 4).
  3. Đặt hai bit cao nhất của nhóm thứ tư thành 10 (do đó chữ số thập lục phân đầu tiên của nhóm đó là 8, 9, a hoặc b).

Chỉ 122 trong số 128 bit thực sự là ngẫu nhiên, vì 6 bit được cố định bởi các bước 2 và 3. Điều đó cho 2^122, tương đương khoảng 5,3 × 10^36 UUID Phiên bản 4 khả dĩ.

Phiên bản 1:

  1. Lấy thời điểm hiện tại dưới dạng số khoảng thời gian 100 nano giây kể từ 15 tháng 10, 1582, ngày cải cách lịch Gregory. Trên thực tế, đó là thời gian Unix thông thường tính bằng mili giây cộng 12.219.292.800.000, rồi nhân với 10.000.
  2. Chia số đếm 60 bit đó vào ba trường: 32 bit thấp nhất được đặt vào time_low, 16 bit tiếp theo vào time_mid, còn 12 bit cao nhất vào time_hi_and_version.
  3. Tạo một dãy số đồng hồ 14 bit, dùng để tránh xung đột nếu đồng hồ hệ thống bị chỉnh lùi.
  4. Tạo một giá trị nút 48 bit, trong đó bit thấp nhất của byte đầu tiên được đặt thành 1.
  5. Đặt các bit phiên bản thành 0001 và các bit biến thể thành 10.

Trên tất cả các phiên bản UUID, không gian đầy đủ 128 bit chứa 2^128, tương đương khoảng 3,4 × 10^38 giá trị khả dĩ. Con số này lớn đến mức va chạm ngẫu nhiên không phải là mối lo thực tế.

Ví dụ minh họa

Đọc UUID Phiên bản 4. Lấy ví dụ ở trên: 550e8400-e29b-41d4-a716-446655440000.

  • Nhóm thứ ba, 41d4: chữ số đầu tiên là 4, cho biết đây là UUID Phiên bản 4.
  • Nhóm thứ tư, a716: chữ số đầu tiên, a (nhị phân 1010), bắt đầu bằng 10, tức các bit biến thể bắt buộc.
  • Các chữ số thập lục phân còn lại là phần dữ liệu ngẫu nhiên.

Chương trình đọc UUID này kiểm tra mẫu 4 và 10 để xác nhận định dạng, sau đó coi phần còn lại là một giá trị ngẫu nhiên không thể diễn giải.

Tạo UUID Phiên bản 1. Giả sử đồng hồ hiển thị 1.700.000.000.000 mili giây theo thời gian Unix, tương ứng với 14 tháng 11, 2023, 22:13:20 UTC.

  1. Cộng độ lệch: 1.700.000.000.000 + 12.219.292.800.000 = 13.919.292.800.000 mili giây.
  2. Nhân với 10.000 để được các khoảng thời gian 100 nano giây: 139,192,928,000,000,000. Ở dạng thập lục phân, giá trị đó là 01EE833B04AFC000.
  3. Cắt chuỗi: time_low = 04AFC000 (8 chữ số thập lục phân thấp nhất), time_mid = 833B (4 chữ số tiếp theo), còn 12 bit cao nhất là 1EE.
  4. Đặt chữ số phiên bản 1 trước 1EE, được time_hi_and_version = 11EE.

UUID khi đó là 04afc000-833b-11ee-, tiếp theo là dãy số đồng hồ và giá trị nút. Phần mềm có thể đảo ngược bốn bước này để khôi phục 14 tháng 11, 2023 từ mã định danh.

Các cách sử dụng UUID phổ biến

  • Khóa chính trong cơ sở dữ liệu, đặc biệt khi nhiều máy chủ tạo bản ghi cùng lúc mà không trao đổi với nhau.
  • Mã thông báo phiên và khóa API, thường dùng Phiên bản 4 vì khả năng bảo vệ quyền riêng tư.
  • Mã định danh cho tệp, sự kiện và tài nguyên trong các hệ thống phân tán như vi dịch vụ.
  • ID thiết bị trong các mạng IoT lớn, nơi mỗi thiết bị có thể tự tạo ID khi ngoại tuyến.

Đánh đổi chính là kích thước: một UUID cần 16 byte lưu trữ, so với 4 hoặc 8 byte đối với bộ đếm số nguyên đơn giản, và một số cơ sở dữ liệu lập chỉ mục UUID chậm hơn số nguyên tuần tự.

Các lựa chọn thay thế UUID

Số nguyên tự tăng nhỏ hơn và đơn giản hơn, nhưng hoạt động không tốt khi có nhiều máy chủ cần độc lập cấp ID. ID Snowflake, do Twitter phát triển, kết hợp dấu thời gian với mã worker để tạo các mã định danh nhỏ gọn, có thể sắp xếp trong hệ thống phân tán. ULID (Mã định danh duy nhất trên toàn cầu có thể sắp xếp theo thứ tự từ điển) là định dạng mới hơn, được thiết kế vừa ngẫu nhiên vừa có thể sắp xếp theo thời điểm tạo, không như UUID Phiên bản 4 tiêu chuẩn.

Lịch sử tiêu chuẩn UUID

Khái niệm UUID bắt đầu vào thập niên 1980 tại Apollo Computer, trong khuôn khổ Network Computing System. Sau đó, Open Software Foundation sử dụng định dạng này cho Distributed Computing Environment. Lực lượng Đặc nhiệm Kỹ thuật Internet công bố RFC 4122 vào năm 2005, rồi thay thế bằng RFC 9562 vào tháng 2024. RFC 9562 giữ cho mọi phiên bản trước đó tiếp tục hoạt động không thay đổi và bổ sung các Phiên bản 6, 7 và 8.

Các câu hỏi thường gặp

Trình tạo UUID được dùng để làm gì? Công cụ này tạo các mã định danh duy nhất cho cơ sở dữ liệu, hệ thống phân tán, mã thông báo phiên, khóa API và ID thiết bị, để không có hai bản ghi nào cần dùng chung một mã định danh.

UUID v1 và v4 khác nhau thế nào? Phiên bản 1 mã hóa dấu thời gian mà phần mềm có thể đọc lại để khôi phục thời điểm tạo. Phiên bản 4 hoàn toàn ngẫu nhiên và không chứa dấu thời gian. Kết quả Phiên bản 1 của công cụ này dùng giá trị nút được tạo ngẫu nhiên thay vì địa chỉ MAC thực, nên cũng không để lộ thông tin nhận diện máy.

Phiên bản 1 có để lộ địa chỉ MAC của tôi không? Không với công cụ này. Tiêu chuẩn cho phép trường nút của UUID Phiên bản 1 chứa địa chỉ MAC thực, nhưng trình tạo này luôn điền trường đó bằng các bit ngẫu nhiên và đặt bit đánh dấu giá trị không phải địa chỉ mạng thực.

UUID có được đảm bảo là duy nhất không? Không có cơ chế mã định danh nào có thể đảm bảo tính duy nhất tuyệt đối, nhưng không gian 128 bit chứa khoảng 3,4 × 10^38 giá trị khả dĩ, còn UUID Phiên bản 4 có khoảng 5,3 × 10^36 giá trị ngẫu nhiên khả dĩ. Khả năng trùng lặp nhỏ đến mức có thể bỏ qua trong hầu hết mọi trường hợp sử dụng thực tế.

Có thể dùng UUID làm khóa chính cơ sở dữ liệu không? Có. UUID hoạt động tốt làm khóa chính trong các hệ thống phân tán vì bất kỳ nút nào cũng có thể tạo UUID mà không cần liên lạc với máy chủ trung tâm. Chi phí là 16 byte lưu trữ cho mỗi khóa, nhiều hơn số nguyên thông thường, cùng khả năng hiệu suất lập chỉ mục chậm hơn trên các bảng rất lớn.

UUID có giống GUID không? Có. GUID (Mã định danh duy nhất toàn cầu) là tên của Microsoft cho cùng khái niệm được RFC 4122 định nghĩa dưới dạng UUID.

Có thể sắp xếp UUID Phiên bản 4 theo thời điểm tạo không? Không. UUID Phiên bản 4 là ngẫu nhiên, nên không chứa thông tin về thời điểm tạo. UUID Phiên bản 1 có chứa thông tin đó, nhưng trước tiên phải giải mã; sắp xếp văn bản không cho ra thứ tự tạo. Phiên bản 6, Phiên bản 7 và ULID được thiết kế để sắp xếp trực tiếp dưới dạng văn bản.

Tài liệu tham khảo

  1. Davis, K., Peabody, B., & Leach, P. (2024). Universally Unique IDentifiers (UUIDs). RFC 9562. https://www.rfc-editor.org/rfc/rfc9562
  2. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://www.rfc-editor.org/rfc/rfc4122
  3. Mã định danh duy nhất trên toàn cầu. Trong Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. ID Snowflake. Trong Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. Đặc tả ULID. GitHub. https://github.com/ulid/spec