Bộ giải mã UUID

Giải mã và kiểm tra cấu trúc, phiên bản và dữ liệu nhúng của UUID

Thử ví dụ

Nhập UUID

Dán UUID ở trên để kiểm tra

Cấu trúc UUID

UUID (Universally Unique Identifier) là giá trị 128-bit được biểu diễn dưới dạng 32 chữ số thập lục phân được chia thành năm nhóm bằng dấu gạch nối:

Định dạng
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
xxxxxxxx (8)8 chữ số hex — 32 bit
xxxx (4)4 chữ số hex — 16 bit
Mxxx (4)4 chữ số hex — 16 bit. Chữ số đầu tiên M mã hóa phiên bản UUID (1–8).
Nxxx (4)4 chữ số hex — 16 bit. Chữ số đầu tiên N mã hóa biến thể UUID (RFC 4122, NCS, Microsoft, hoặc dành riêng).
xxxxxxxxxxxx (12)12 chữ số hex — 48 bit

Phiên bảnbiến thể là hai trường được đảm bảo có mặt trong mọi UUID.

Trường Phiên bản

Nibble phiên bản là chữ số hex đầu tiên của nhóm thứ ba (vị trí 14 trong chuỗi đầy đủ).

JavaScript
const hex = uuid.replace(/-/g, '')
const version = parseInt(hex[12], 16)  // single hex digit → 1, 2, 3, 4, 5, 6, 7, or 8

Phiên bản 7 (UUID v7) là phiên bản mới nhất được sử dụng rộng rãi, được giới thiệu trong RFC 9562 (2024).

Trường Biến thể

Biến thể được mã hóa trong các bit cao của byte đầu tiên của nhóm thứ tư.

Bit caoPhạm vi chữ số hex đầu tiênBiến thểMô tả
0xxx xxxx0x00–0x7FTương thích ngược NCSUUID NCS (Network Computing System) cũ. Được dành riêng để tương thích ngược.
10xx xxxx0x80–0xBFRFC 4122 / RFC 9562Biến thể UUID RFC 4122 / RFC 9562 tiêu chuẩn. Được sử dụng bởi tất cả các phiên bản UUID hiện đại (v1–v8).
110x xxxx0xC0–0xDFTương thích ngược MicrosoftGUID Microsoft COM/DCOM cũ với thứ tự byte khác. Vẫn gặp trong các thành phần Windows COM.
111x xxxx0xE0–0xFFDành riêngDành riêng cho định nghĩa trong tương lai. Không được sử dụng bởi bất kỳ phiên bản UUID hiện tại nào.

Trong thực tế, hầu hết các UUID bạn gặp đều sử dụng biến thể RFC 4122 / RFC 9562 (mẫu bit 10xx xxxx, byte đầu tiên của nhóm thứ tư trong phạm vi 0x80–0xBF). Các biến thể NCS, Microsoft COM và Reserved là các định dạng cũ hiếm khi xuất hiện trong các hệ thống hiện đại.

Tham chiếu Phiên bản UUID

RFC 4122 định nghĩa các phiên bản 1–5. RFC 9562 (2024) thêm các phiên bản 6, 7, và 8:

Phiên bảnTênTiêu chuẩnMô tả
v1Dựa trên thời gianRFC 4122Timestamp (epoch Gregorian, độ chính xác 100ns) + địa chỉ MAC. Tuần tự theo máy chủ nhưng rò rỉ danh tính máy chủ.
v2DCE SecurityRFC 4122Dựa trên UUID v1 với trường time_low được thay thế bởi POSIX UID/GID. Hiếm khi dùng ngoài hệ thống DCE/RPC cũ.
v3Dựa trên tên MD5RFC 4122Xác định: hash MD5 của UUID namespace + chuỗi tên. Cùng đầu vào luôn tạo ra cùng UUID. Ưu tiên v5.
v4Ngẫu nhiênRFC 4122122 bit ngẫu nhiên an toàn về mặt mật mã. Phiên bản UUID đa mục đích phổ biến nhất.
v5Dựa trên tên SHA-1RFC 4122Giống v3 nhưng sử dụng SHA-1. Kháng va chạm hơn MD5. Được ưu tiên hơn v3 cho UUID dựa trên tên mới.
v6Thời gian Sắp xếp lạiRFC 9562Sắp xếp lại các trường timestamp UUID v1 để UUID có thể sắp xếp theo trình tự thời gian. Được định nghĩa trong RFC 9562.
v7Thời gian UnixRFC 9562Timestamp Unix mili giây 48-bit ở bit cao + dữ liệu ngẫu nhiên. Có thể sắp xếp và thân thiện với chỉ mục B-tree. Ưu tiên cho ID theo thứ tự thời gian mới.
v8Tùy chỉnhRFC 9562Hình thức tự do: tất cả bit ngoại trừ phiên bản và biến thể được xác định bởi ứng dụng. Không có thuật toán tạo nào được chỉ định.

Giải mã Timestamp UUID v1

UUID v1 nhúng timestamp Gregorian 60-bit (khoảng cách 100 nano giây kể từ ngày 15 tháng 10 năm 1582) được phân tán qua ba trường.

JavaScript
// UUID v1: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
//           ^^^^^^^^ ^^^^ ^^^^ ^^^^^ ^^^^^^^^^^^^
//           time-low  mid  hi  clk   node (MAC)
//                          ^
//                          version nibble (1)

const hex = '6ba7b8109dad11d180b400c04fd430c8'

const tLow = parseInt(hex.slice(0, 8),  16)  // 0x6ba7b810
const tMid = parseInt(hex.slice(8, 12), 16)  // 0x9dad
const tHi  = parseInt(hex.slice(13, 16), 16) // 0x1d1 (skip version nibble at index 12)

// Reconstruct 60-bit timestamp (100-ns intervals since Oct 15, 1582)
const t = (BigInt(tHi) << 48n) | (BigInt(tMid) << 32n) | BigInt(tLow)

// Subtract Gregorian offset (Oct 15, 1582 → Jan 1, 1970 in 100-ns units)
const GREGORIAN_OFFSET = 122192928000000000n
const unixMs = (t - GREGORIAN_OFFSET) / 10000n

console.log(new Date(Number(unixMs)).toISOString())
// → 1998-02-04T22:13:53.578Z
Note:Trường chuỗi đồng hồ (14 bit) ngăn các bản trùng khi đồng hồ chạy lùi. Trường node (48 bit) thường là địa chỉ MAC của máy chủ tạo.

UUID v1 nên được xử lý như thông tin nhạy cảm: địa chỉ MAC nhúng và timestamp chính xác có thể xác định cả máy tạo và thời gian tạo.

Giải mã Timestamp UUID v7

UUID v7 nhúng timestamp Unix mili giây 48-bit vào 48 bit đầu tiên (nhóm đầu tiên + 4 chữ số đầu tiên của nhóm thứ hai).

JavaScript
// UUID v7: 018e4bc8-1000-7000-8000-000000000001
//           ^^^^^^^^^^^^
//           48-bit Unix ms timestamp

const hex = '018e4bc8100070008000000000000001'

// First 48 bits (12 hex chars) = Unix timestamp in milliseconds
const ms = parseInt(hex.slice(0, 12), 16)  // 0x018e4bc81000

console.log(new Date(ms).toISOString())
// → 2024-03-11T…Z

// Everything after byte 6 is random (except version/variant bits)

Không giống UUID v1, timestamp UUID v7 sử dụng epoch Unix quen thuộc (1 tháng 1 năm 1970) và không nhúng bất kỳ thông tin máy chủ nào.

Cách Công cụ này Phát hiện Phiên bản và Biến thể UUID

Bộ giải mã đọc vị trí 14 (nibble phiên bản) và vị trí 19 (nibble biến thể) của chuỗi UUID chính tắc.

JavaScript
// Detect UUID version from the 13th hex character (index 12)
function uuidVersion(uuid) {
  const clean = uuid.replace(/-/g, '')
  return parseInt(clean[12], 16)
}

uuidVersion('550e8400-e29b-41d4-a716-446655440000') // → 4
uuidVersion('018e4bc8-1000-7000-8000-000000000001') // → 7
uuidVersion('6ba7b810-9dad-11d1-80b4-00c04fd430c8') // → 1

// Detect variant from the 17th hex character (index 16, first char of 4th group)
function uuidVariant(uuid) {
  const clean = uuid.replace(/-/g, '')
  const b = parseInt(clean[16], 16)
  if ((b & 0x8) === 0)      return 'NCS'
  if ((b & 0xC) === 0x8)    return 'RFC 4122'
  if ((b & 0xE) === 0xC)    return 'Microsoft'
  return 'Reserved'
}

UUID Đặc biệt

Nil UUID

Nil UUID 00000000-0000-0000-0000-000000000000 là tất cả số không. Được định nghĩa bởi RFC 4122 là giá trị sentinel có nghĩa là 'không có UUID' — tương tự như null.

Max UUID

Max UUID ffffffff-ffff-ffff-ffff-ffffffffffff là tất cả số một (0xFF trong mỗi byte). Được định nghĩa trong RFC 9562.

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

Làm thế nào tôi biết UUID nào là phiên bản nào?
Nhìn vào vị trí 14 trong chuỗi UUID chính tắc (ký tự đầu tiên của nhóm thứ ba được phân cách bằng dấu gạch nối). Chữ số hex đơn đó là số phiên bản.
Tôi có thể giải mã UUID để lấy lại dữ liệu gốc không?
Phụ thuộc vào phiên bản. UUID v1 và v7 nhúng timestamp có thể được phục hồi đầy đủ. UUID v3 và v5 là các hash một chiều.
'biến thể' trong UUID có nghĩa gì?
Trường biến thể xác định quy ước bố cục byte và diễn giải của UUID.
Tại sao một số UUID trông khác với những cái khác?
Sự khác biệt trực quan nằm ở nibble phiên bản (vị trí 14) và nibble biến thể (vị trí 19).
Nil UUID có giống với UUID rỗng không?
Về mặt khái niệm có — nil UUID (tất cả số không) được sử dụng để đại diện cho sự vắng mặt của UUID, tương tự như null.
UUID có thể không hợp lệ không?
UUID có thể hợp lệ về mặt cú pháp (định dạng đúng) nhưng không bình thường về mặt ngữ nghĩa.
Sự khác biệt giữa UUID và GUID là gì?
GUID là tên của Microsoft cho cùng một khái niệm. GUID tuân theo cùng định dạng 128-bit RFC 4122.