UUID 구조
UUID(Universally Unique Identifier)는 하이픈으로 5개 그룹으로 나뉜 32개의 16진수 문자로 표현되는 128비트 값입니다:
버전과 변형은 모든 UUID에 존재가 보장되는 유일한 두 필드입니다. 다른 모든 필드는 버전에 따라 다릅니다.
버전 필드
버전 니블은 세 번째 그룹의 첫 번째 16진수(전체 문자열의 위치 14)입니다. 식별자를 생성하는 데 사용된 UUID 버전을 식별합니다.
const hex = uuid.replace(/-/g, '') const version = parseInt(hex[12], 16) // single hex digit → 1, 2, 3, 4, 5, 6, 7, or 8
버전 7(UUID v7)은 RFC 9562(2024)에서 도입된 가장 최신의 광범위하게 사용되는 버전입니다. 정렬 가능성을 위해 상위 비트에 Unix 밀리초 타임스탬프를 인코딩합니다.
변형 필드
변형은 네 번째 그룹의 첫 번째 바이트의 상위 비트에 인코딩됩니다. UUID가 사용하는 레이아웃 및 바이트 순서 규칙을 식별합니다.
| 상위 비트 | 첫 번째 16진수 범위 | 변형 | 설명 |
|---|---|---|---|
| 0xxx xxxx | 0x00–0x7F | NCS 하위 호환성 | 레거시 네트워크 컴퓨팅 시스템(NCS) UUID. 하위 호환성을 위해 예약. |
| 10xx xxxx | 0x80–0xBF | RFC 4122 / RFC 9562 | 표준 RFC 4122 / RFC 9562 UUID 변형. 모든 현대 UUID 버전(v1-v8)에서 사용됩니다. |
| 110x xxxx | 0xC0–0xDF | Microsoft 하위 호환성 | 다른 바이트 순서를 가진 레거시 Microsoft COM/DCOM GUID. Windows COM 구성 요소에서 여전히 볼 수 있습니다. |
| 111x xxxx | 0xE0–0xFF | 예약됨 | 미래 정의를 위해 예약됨. 현재 UUID 버전에서는 사용되지 않습니다. |
실제로 접하는 거의 모든 UUID는 RFC 4122 / RFC 9562 변형(비트 패턴 10xx xxxx, 네 번째 그룹의 첫 번째 바이트가 0x80–0xBF 범위)을 사용합니다. NCS, Microsoft COM 및 Reserved 변형은 현대 시스템에서 거의 볼 수 없는 레거시 형식입니다.
UUID 버전 참조
RFC 4122는 버전 1-5를 정의했습니다. RFC 9562(2024)는 버전 6, 7, 8을 추가했습니다:
| 버전 | 이름 | 표준 | 설명 |
|---|---|---|---|
| v1 | 시간 기반 | RFC 4122 | 타임스탬프(그레고리안 에포크, 100ns 정밀도) + MAC 주소. 호스트별 순차이지만 호스트 신원을 누출합니다. |
| v2 | DCE 보안 | RFC 4122 | UUID v1 기반, time_low 필드가 POSIX UID/GID로 대체됨. 레거시 DCE/RPC 시스템 외에서는 거의 사용되지 않습니다. |
| v3 | 이름 기반 MD5 | RFC 4122 | 결정론적: 네임스페이스 UUID + 이름 문자열의 MD5 해시. 동일한 입력은 항상 동일한 UUID를 생성합니다. v5를 선호하세요. |
| v4 | 무작위 | RFC 4122 | 암호학적으로 안전한 122비트 무작위성. 가장 일반적인 범용 UUID 버전. |
| v5 | 이름 기반 SHA-1 | RFC 4122 | v3과 유사하지만 SHA-1 사용. MD5보다 충돌 방지력이 높습니다. 새 이름 기반 UUID에 v3보다 선호됩니다. |
| v6 | 재정렬 시간 | RFC 9562 | UUID v1 타임스탬프 필드를 재정렬하여 UUID가 시간순으로 정렬 가능하게 합니다. RFC 9562에 정의됨. |
| v7 | Unix 시간 | RFC 9562 | 상위 비트에 48비트 Unix 밀리초 타임스탬프 + 무작위 데이터. 정렬 가능하고 B-tree 인덱스 친화적. 새 시간 순서 ID에 선호. |
| v8 | 사용자 정의 | RFC 9562 | 자유 형식: 버전 및 변형을 제외한 모든 비트는 애플리케이션 정의. 생성 알고리즘이 지정되지 않았습니다. |
UUID v1 타임스탬프 디코딩
UUID v1은 세 필드에 걸쳐 60비트 그레고리안 타임스탬프(1582년 10월 15일부터 100나노초 간격)를 내장합니다: time_low(비트 0-31), time_mid(비트 32-47), time_hi(비트 48-59). 이 도구는 이를 재조립하여 표준 UTC 날짜로 변환합니다.
// 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
UUID v1은 민감하게 취급해야 합니다: 내장된 MAC 주소와 정확한 타임스탬프는 생성 머신과 생성 시간 모두를 식별할 수 있습니다.
UUID v7 타임스탬프 디코딩
UUID v7은 처음 48비트(첫 번째 그룹 + 두 번째 그룹의 처음 4자리)에 48비트 Unix 밀리초 타임스탬프를 내장합니다. 이 도구는 이 비트를 읽고 밀리초 정밀도로 UTC 날짜로 변환합니다.
// 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)
UUID v1과 달리 UUID v7 타임스탬프는 친숙한 Unix 에포크(1970년 1월 1일)를 사용하며 호스트 정보를 내장하지 않습니다. 나머지 74비트는 무작위입니다.
이 도구가 UUID 버전과 변형을 감지하는 방법
디코더는 표준 UUID 문자열의 위치 14(버전 니블)와 위치 19(변형 니블)를 읽습니다. 외부 상태나 컨텍스트가 필요 없습니다——모든 정보는 UUID 문자열에 자기 포함됩니다.
// 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
Nil UUID
nil UUID 00000000-0000-0000-0000-000000000000는 모두 0입니다. RFC 4122에서 'UUID 없음'을 의미하는 센티널 값으로 정의됩니다——null과 유사합니다. 유효한 생성된 UUID가 아닙니다.
Max UUID
max UUID ffffffff-ffff-ffff-ffff-ffffffffffff는 모두 1(모든 바이트에서 0xFF)입니다. RFC 9562에 정의되며 nil UUID의 보완으로 최대 센티널 값으로 사용됩니다.