반응형
UUID란
- Universally Unique IDentifier 의 약자 : "범용 고유 식별자" 라고 번역합니다.
- RFC 4122 표준으로 정의되어 있습니다 : RFC4122
- UUID 버전마다 정의가 다르며, 1~5까지 현재 5개의 버전이 나와 있습니다.
- 총 32자리의 16진수로 되어 있습니다.
- 각 자리가 16진수 (= 4 bit = 1 nibble) 이므로, 비트로 환산하면 128 bit = 16 Byte 가 됩니다.
- 구성은 5개의 서브 모듈로 되어 있고, 각 모듈은 8-4-4-4-12 개의 16진수로 구성됩니다. (예시. 550e8400-e29b-41d4-a716-446655440000)
- 현재의 구성대로라면 서기 약 3400년 정도까지는 중복 없이 사용 가능하다고 합니다. (대략 1380년 정도 남았습니다.)
버전별 특징
버전 | 설명 | 특징 |
---|---|---|
1 | 해당 버전은 “현재 시간”과 “랜덤한 MAC 주소”를 기반으로 생성됩니다. | 유일성이 보장되지만 보안에 취약 |
2 | 해당 버전은 이전 버전 1과 유사하지만 시퀀스 번호 대신 POSIX UID(사용자 ID)를 사용하여 생성됩니다. | 현재는 거의 사용하지 않습니다. |
3 | 해당 버전은 해시 함수인 “MD5 해시”를 기반으로 이름과 네임스페이스에 대한 조합으로 생성됩니다. | 암호화 해시 함수를 사용하여 생성하므로 보안성이 높음. 이름과 네임스페이스가 같으면 같은 UUID가 생성됩니다. |
4 | 해당 버전은 “랜덤한 값”을 기반으로 생성됩니다. | 보안성이 높고 생성속도가 빠릅니다. |
5 | 해당 버전은 이전 버전 3과 유사하지만 “SHA-1 해시”를 사용하여 생성됩니다. |
구성
포맷
{time_low} - {time_mid} - {time-high-and-version} - {clock-seq-hi-and-reserved}{clock-seq-low} - {node}
레이아웃
0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
time-low | |||||||||||||||||||||||||||||||
time-mid | time-high-and-version | ||||||||||||||||||||||||||||||
clk-seq-hi-and-reserved | clk-seq-low | node (0-1) | |||||||||||||||||||||||||||||
node (2-5) |
레이아웃 별 상세 의미
각 자리의 뜻
Field | Byte Number | Note |
---|---|---|
time_low | 0-3 | The low field of the timestamp |
time_mid | 4-5 | The middle field of the timestamp |
time_high_and_version | 6-7 | the high field of the timestamp multiplexed with the version number |
clock_seq_hi_and_reserved | 8 | The high field of the clock sequence multiplexed with the variant |
clock_seq_low | 9 | The low fiel of the clock sequence |
node | 10-15 | The spatially unique node identifier |
타임스탬프
- 타임스탬프는 총 60 bit 입니다.
- UUID 버전 1은 UTC 1582.10.15 00:00:00.000 을 기준으로, 100 나노초 단위로 센 오프셋의 값을 수정하여 60비트를 만들어 냅니다.
- UUID 버전 3/5 는 미리 정의된 몇가지 네임스페이스를 기준으로 이를 만들어내고, 변환하는 방법이 MD5와 SHA-1 해시로 다릅니다.
- UUID 버전 4는 random 또는 pseudo-random 하게 이 바이트들을 생성해냅니다.
- 만들어낸 60비트 숫자를 다음과 같이 할당합니다.
- LSB 순으로 0-31 bit 는 time_low 에 할당
- 32-47 비트는 time_mid 에 할당
- 48-59는 time_high_and_version 의 LSB 순으로 할당
버전
- 버전은 UUID 버전을 나타냅니다.
- time_high_and_version 의 MSB 4비트에 할당됩니다.
- 즉, 사람 눈으로 보기에는 3번째 서브 모듈의 첫번째 16진수는 UUID 버전입니다.
숫자 | 0 | 1 | 2 | 3 | 비고 |
---|---|---|---|---|---|
0x1 | 0 | 0 | 0 | 1 | 버전 1 |
0x2 | 0 | 0 | 1 | 0 | 버전 2 |
0x3 | 0 | 0 | 1 | 1 | 버전 3 |
0x4 | 0 | 1 | 0 | 0 | 버전 4 |
0x5 | 0 | 1 | 0 | 1 | 버전 5 |
Clock Sequence
- 클럭에다가 시퀀스라는 이름이 같이 있으니 뭔가 했으나, 그냥 랜덤 넘버를 나타냅니다. stack overflow에서는 "misleading name" 이라고 말하기도 합니다.
- UUID 버전 1에서 이걸 왜 썼냐면, 첫 60 비트를 Timestamp를 이용했으니 혹시나 클럭에 따라 시간이 거꾸로 흐르게 설정되어 있을 경우 중복될 경우를 방지하기 위해서 추가적인 랜덤 넘버를 둔 것이라고 합니다.
- UUID 버전 3/5 에서는 네임스페이스에서 생성한 랜덤 넘버 중 일부를 이 자리수에 채워넣습니다.
- UUID 버전 4에서는 random 혹은 pseudo-random 넘버를 채워넣습니다.
Node
- UUID 버전 1에서는 MAC주소로부터 생성한 값
- UUID 버전 3/5에서는 마찬가지로 네임스페이스에서 생성한 랜덤 넘버 중 일부를 할당
- UUID 버전 4에서도 역시 random 혹은 pseudo-random 넘버를 채워넣습니다.
결론적으로
- UUID 버전 1에서는 각 자리수별 의미들이 각기 다르고, 시공간을 결합하여 유일성을 보장하고자 하는 의미가 컸으나
- 보안에 취약하다는 단점이 있어 이를 보완하는 과정에서
- 결국 UUID 버전 3/4/5로 가면서는 방식만 조금씩 다르지, 각 자리의 의미가 별 차이 없이 거의 랜덤 넘버로 생성된다는 특징이 있습니다.
- 단, 버전에 관계없이 UUID의 3번째 서브모듈의 첫번째 16진수는 UUID의 버전을 가리킵니다. 예시는 아래와 같습니다.
Version | Note | Example |
---|---|---|
Version 1 | MAC address & timestamp | 550e8400-e29b-11ea-a716-446655440000 |
Version 3 | MD5 hash & namespace | f84118c2-56e0-3408-98d7-6d8360cd75e4 |
Version 4 | Random | 550e8400-e29b-41d4-a716-446655440000 |
Version 5 | SHA-1 hash & namespace | 66e3abd5-4b0a-5b3a-a73f-656bb7093d9c |
반응형
댓글