Trình tạo UUID miễn phí

Tạo giá trị UUID v4 ngẫu nhiên ngay lập tức.

Không có dữ liệu nào rời khỏi thiết bị của bạn

Tạo nhanh

-

Tạo hàng loạt

Về UUID

UUID (Universally Unique Identifier, Định danh duy nhất toàn cầu) là một định danh 128-bit được thiết kế để duy nhất trên cả không gian và thời gian. Phiên bản phổ biến nhất, UUID v4, được tạo bằng các số ngẫu nhiên hoặc giả ngẫu nhiên. Định dạng là 8-4-4-4-12 ký tự thập lục phân, ví dụ 550e8400-e29b-41d4-a716-446655440000.

Lịch sử bốn thập niên, từ Apollo đến RFC 9562

Khái niệm UUID ra đời trong Apollo Network Computing System (NCS) giữa thập niên 1980, do Paul Leach và Rich Salz thiết kế tại Apollo Computer để hỗ trợ tính toán phân tán không có đăng ký trung tâm. Định dạng được Open Software Foundation Distributed Computing Environment (OSF DCE) chấp nhận năm 1989 và chuẩn hóa quốc tế năm 1995 dưới ITU-T X.667 / ISO/IEC 9834-8. IETF tích hợp đặc tả vào RFC 4122 (Leach, Mealling, Salz) tháng 7 năm 2005, trở thành tham chiếu kinh điển trong hai thập niên. RFC 4122 được cập nhật bởi RFC 9562 tháng 5 năm 2024, giữ mọi phiên bản gốc (v1 đến v5), thêm ba phiên bản mới (v6, v7, v8), và chính thức định nghĩa các hằng đặc biệt "Nil UUID" (toàn không) và "Max UUID" (toàn một). Dòng dõi phiên bản quan trọng vì mỗi phiên bản đánh đổi tính chất khác: dựa trên thời gian (sắp xếp được, rò rỉ); dựa trên tên (tất định từ đầu vào); ngẫu nhiên (phổ quát, mờ đục); tùy biến (thứ bạn cần). Thực hành tốt nhất hiện đại cho ứng dụng mới đã chuyển từ v4 (ngẫu nhiên) sang v7 (timestamp + ngẫu nhiên) cho khóa chính, trong khi v4 vẫn là câu trả lời đúng cho định danh mờ đục nơi tính sắp xếp được không mong muốn.

Tám phiên bản, bằng tiếng Việt rõ ràng

Vì sao v7 ngày càng được ưa hơn v4 cho khóa cơ sở dữ liệu

Khóa chính ngẫu nhiên (UUID v4) có chi phí hiệu năng được ghi chép kỹ trong cơ sở dữ liệu tổ chức hàng theo khóa chính trong B-tree hoặc index tương tự. Mỗi insert mới đáp xuống vị trí ngẫu nhiên trong index, làm phân mảnh trang index, tăng khuếch đại ghi đĩa, và làm vỡ cache trang vì các hàng vừa insert nằm rải rác trên nhiều trang thay vì gom lại. Khóa tuần tự (số nguyên tự tăng, ULID, UUID v7) đều insert ở cạnh phải của index, giữ working set nhỏ và khuếch đại ghi tối thiểu. Phê bình "anti-pattern khóa ngẫu nhiên" có gốc từ tài liệu SQL Server đầu thập niên về NEWID so với NEWSEQUENTIALID, và được cộng đồng Postgres phát biểu lại cho v4 vs v7. Đánh đổi: v7 rò rỉ thời gian tạo của mỗi hàng, có thể là quan ngại quyền riêng tư hoặc rò rỉ thông tin trong một số ứng dụng (ví dụ bạn có thể nói khi nào tài khoản được tạo bằng cách đọc UUID của nó). Cho phần lớn ứng dụng, lợi hiệu năng vượt rò rỉ timestamp; cho ứng dụng quyền riêng tư cao, v4 vẫn là câu trả lời đúng.

Xác suất va chạm, toán học của paradox sinh nhật

UUID v4 có 122 bit ngẫu nhiên, cho khoảng 5,3 × 1036 giá trị có thể. Paradox sinh nhật nói bạn cần khoảng căn bậc hai kích thước namespace để có 50% cơ hội có va chạm bất kỳ, khoảng 2,3 × 1018 UUID. Để đặt vào ngữ cảnh người: nếu bạn sinh 1 tỷ UUID mỗi giây liên tục, bạn sẽ cần khoảng 86 năm để có 50% cơ hội của một va chạm duy nhất. Với tốc độ sinh quy mô ứng dụng thông thường (hàng nghìn hay hàng triệu mỗi ngày), rủi ro va chạm thực tế là không. Nguyên nhân có khả năng nhất của "UUID trùng" trong hệ thống thật là một bộ sinh có lỗi dùng Math.random() thay vì CSPRNG, hoặc một bộ sinh có entropy không đủ lúc khởi động, hoặc một tiến trình vô tình seed hai bộ sinh giống nhau, không phải toán học bên dưới. Bộ sinh này dùng crypto.randomUUID() của trình duyệt (nơi có sẵn) hoặc crypto.getRandomValues(), cả hai rút từ CSPRNG của hệ điều hành (Linux getrandom(), Windows BCryptGenRandom, macOS SecRandomCopyBytes), cùng nguồn entropy được dùng cho khóa phiên TLS.

Triển khai trình duyệt: crypto.randomUUID()

Web Crypto API phơi crypto.randomUUID() như bộ sinh một-cuộc-gọi trả về chuỗi UUID v4 tuân theo RFC 4122. Nó được giao trong Chrome 92 (tháng 7 năm 2021), Firefox 95 (tháng 12 năm 2021) và Safari 15.4 (tháng 3 năm 2022), và baseline-có-sẵn trong mọi trình duyệt hiện đại từ khoảng 2022. Cho trình duyệt cũ hơn, fallback chuẩn là cấp phát Uint8Array 16 byte, đổ đầy bằng crypto.getRandomValues(), đặt nibble phiên bản thành 4 (nibble cao của byte thứ 7 = 0x40), đặt bit variant thành 10xxxxxx (hai bit cao của byte thứ 9 = 0x80), và định dạng các byte thành chuỗi hex 8-4-4-4-12. Bộ sinh này dùng crypto.randomUUID() khi có và fallback thủ công nếu không, đầu ra giống nhau ở cả hai trường hợp, chỉ chậm hơn chút trên đường fallback. Cả hai đường chạy hoàn toàn trong trình duyệt; không gì đi qua mạng.

Trường hợp dùng và mỗi cái thực sự cần gì

Các phương án thay thế đáng biết

UUID là mặc định phổ quát nhưng không phải lựa chọn duy nhất, và một số phương án đáng biết cho các trường hợp dùng cụ thể. ULID (Universally Unique Lexicographically Sortable Identifier, Alex Knol, ~2016): 128 bit như UUID, nhưng mã hóa thành 26 ký tự Crockford-Base32 thay vì 32 chữ số hex, gọn hơn và URL-an-toàn không phân biệt hoa thường. 48 bit đầu là timestamp Unix theo mili-giây, nên ULID sắp xếp lexicographic theo thời gian tạo. Khái niệm rất gần UUID v7, có trước nhiều năm. Snowflake (Twitter, 2010): 64 bit, nhỏ hơn UUID rất nhiều, vừa trong BIGINT SQL. 41 bit timestamp + 10 bit ID máy + 12 bit chuỗi mỗi mili-giây. Được Twitter/X, Discord, Instagram, và nhiều hệ thống quy mô lớn nơi khóa chính 64 bit là ràng buộc cứng dùng. KSUID (Segment, 2017): 27 ký tự, timestamp độ chính xác giây + 128 bit ngẫu nhiên. Đánh đổi độ chính xác mili-giây cho biểu diễn chuỗi nhỏ hơn UUID. nanoid (Andrey Sitnik, 2017): thư viện rất nhỏ tạo định danh ngẫu nhiên URL-an-toàn độ dài cấu hình được. Mặc định 21 ký tự cho khả năng chống va chạm tương tự UUID v4 với rất ít byte hơn. Cho URL công khai nơi bạn sẽ nhúng UUID, nanoid ngắn hơn và thân thiện hơn. Đánh đổi: định danh nanoid không có bit đánh dấu phiên bản + variant phân biệt nó là UUID, nên chúng không khớp vào hệ thống mong giá trị hình UUID.

An toàn URL và biến thể định dạng

UUID ở dạng kinh điển có gạch nối (550e8400-e29b-41d4-a716-446655440000) là URL-an-toàn, mọi ký tự (chữ thường, chữ số, gạch nối) nằm trong tập không-dành-riêng định nghĩa bởi RFC 3986. Nghĩa là bạn có thể thả UUID trực tiếp vào path URL hay query string mà không cần percent-encoding. Một số hệ thống bỏ gạch nối cho gọn, tạo chuỗi hex 32 ký tự (550e8400e29b41d4a716446655440000) vẫn URL-an-toàn; chuyển đổi đảo ngược được vì cấu trúc UUID cố định. Một vài hệ thống bọc UUID trong dấu ngoặc nhọn ({550e8400-e29b-41d4-a716-446655440000}), quy ước GUID của Microsoft; ngoặc nhọn trang trí và không bao giờ đi vào URL. Một số hệ thống đặt ký tự hex thành chữ hoa; UUID không phân biệt hoa thường theo đặc tả, nhưng nhất quán trong một hệ thống quan trọng. Bộ sinh này cho ba tùy chọn (chữ hoa, ngoặc nhọn, không gạch nối) cho khả năng tương thích với bất kỳ pipeline nào bạn cấp UUID.

UUID vs GUID, cùng một thứ, tên khác

UUID là thuật ngữ chuẩn được IETF, ISO và phần lớn dự án mã nguồn mở dùng. GUID (Globally Unique Identifier) là thuật ngữ Microsoft dùng trong Windows, .NET, COM/OLE, SQL Server, Active Directory và Windows Registry. Cả hai chỉ về định danh 128 bit giống hệt nhau ở cùng định dạng hex 8-4-4-4-12. Trao đổi được về chức năng, một GUID sinh bởi Windows có thể dùng ở bất cứ đâu mong UUID, và ngược lại. Khác biệt duy nhất cần biết: việc sinh GUID của Microsoft trong lịch sử đã dùng UUID v4 trong nhiều API nhưng UUID v1 (với địa chỉ MAC) trong một số ngữ cảnh COM/OLE cũ; điều này được tài liệu trong đặc tả COM của Microsoft. Nếu bạn nhận GUID từ hệ thống nguồn Microsoft và muốn biết phiên bản nào, kiểm tra nibble phiên bản (ký tự hex thứ 13, '1' cho v1, '4' cho v4, vân vân).

Quyền riêng tư: vì sao chỉ-trong-trình-duyệt quan trọng ngay cả ở đây

Một UUID không có ý nghĩa nội tại, vậy vì sao việc bộ sinh chạy cục bộ quan trọng? Hai lý do. Thứ nhất, khi UUID được dùng làm token phiên, khóa idempotency hay bất kỳ định danh giống bí mật nào, sinh nó trên server bên thứ ba nghĩa là server đó đã thấy giá trị trước khi bạn dùng, một phơi bày nhỏ nhưng có thật. Thứ hai, các bộ sinh phía server hứa "ngẫu nhiên mật mã" không thể được người dùng kiểm chứng; một server có lỗi hoặc độc hại có thể trả về giá trị không-ngẫu-nhiên trông như ngẫu nhiên, và bạn không có cách nào phát hiện lệch. Một bộ sinh chỉ-trình-duyệt thực thi cùng cuộc gọi crypto.randomUUID() mà ứng dụng của bạn sẽ thực thi phía server; entropy đến từ cùng nguồn hệ điều hành (Linux getrandom(), Windows BCryptGenRandom, macOS SecRandomCopyBytes); không có bên thứ ba nào thấy đầu ra. Bạn có thể kiểm chứng bằng cách mở tab Network của DevTools khi bạn bấm Sinh, không có request đi ra. Đặt trang offline (chế độ máy bay) sau khi đã tải xong và bộ sinh vẫn hoạt động.

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

Sự khác biệt giữa UUID và GUID là gì?

Về bản chất, chúng là cùng một thứ. UUID là thuật ngữ tiêu chuẩn (RFC 4122), trong khi GUID (Globally Unique Identifier) là thuật ngữ của Microsoft. Cả hai đều chỉ một định danh 128-bit theo cùng định dạng hex 8-4-4-4-12.

Hai UUID có bao giờ giống nhau không?

Về mặt lý thuyết là có, nhưng xác suất cực kỳ thấp. UUID v4 có 122 bit ngẫu nhiên, cho khoảng 5.3 × 10³⁶ giá trị khả dĩ. Bạn sẽ cần tạo hàng tỷ UUID mỗi giây trong nhiều thập kỷ để có 50% cơ hội xảy ra một va chạm.

Các UUID này có an toàn về mặt mật mã không?

Có. Trình tạo này sử dụng Web Crypto API (crypto.getRandomValues), cung cấp các giá trị ngẫu nhiên mạnh về mặt mật mã. Đầu ra phù hợp cho các trường hợp sử dụng nhạy cảm về bảo mật như token phiên.

Tôi nên dùng UUID v4 hay v7 cho khóa chính cơ sở dữ liệu của mình?

v7 là khuyến nghị hiện đại nếu cơ sở dữ liệu của bạn hỗ trợ. v4 (ngẫu nhiên) insert ở vị trí ngẫu nhiên trong index B-tree, phân mảnh index, và làm vỡ cache trang. v7 (timestamp + ngẫu nhiên, RFC 9562 tháng 5 năm 2024) insert ở cạnh phải của index vì các ID sắp xếp theo thời gian tạo, cùng hiệu năng ghi như số nguyên tự tăng, với tính phân phối và duy nhất của UUID. Postgres 18+ có uuidv7() tích hợp. Đánh đổi: v7 rò rỉ thời gian tạo của mỗi hàng, có thể là quan ngại quyền riêng tư trong một số ứng dụng. Cho phần lớn trường hợp dùng, lợi hiệu năng vượt rò rỉ timestamp.

ULID, KSUID và nanoid là gì?

Các định dạng ID thay thế. ULID (Alex Knol, ~2016): 128 bit như UUID nhưng mã hóa thành 26 ký tự Crockford-Base32; sắp xếp lexicographic theo timestamp. KSUID (Segment, 2017): 27 ký tự, timestamp độ chính xác giây + 128 bit ngẫu nhiên. nanoid (Andrey Sitnik, 2017): thư viện rất nhỏ tạo ID URL-an-toàn ngẫu nhiên độ dài cấu hình được; mặc định 21 ký tự cho khả năng chống va chạm tương tự UUID v4 với rất ít byte hơn. Snowflake (Twitter, 2010): ID 64 bit vừa trong BIGINT SQL, được Twitter, Discord và Instagram dùng. Dùng UUID khi hệ thống nhận mong định dạng UUID; dùng các phương án thay thế khi bạn có yêu cầu cụ thể về kích thước, sắp xếp được hay thân thiện URL.

UUID có được gửi đi đâu không?

Không. Mỗi UUID được sinh cục bộ trong trình duyệt dùng Web Crypto API. Bộ sinh không bao giờ gọi mạng, hãy kiểm chứng trong tab Network của DevTools khi bạn bấm Sinh, hoặc đặt trang offline sau khi đã tải xong và xác nhận công cụ vẫn hoạt động. An toàn để sinh token phiên, khóa idempotency hay định danh khác mà bạn không muốn bên thứ ba thấy giá trị trước bạn.

Công cụ liên quan