UUID v3 개요
UUID v3는 이름 기반(name-based) 버전입니다. 네임스페이스 UUID와 이름을 이어 붙여 MD5로 해시한 뒤, 그 결과를 128비트 UUID로 정리합니다. 그래서 무작위성이 전혀 없습니다.
값이 입력에서 결정되므로 어느 시스템에서 계산하든 결과가 같습니다. 대신 MD5가 암호학적으로 안전하지 않다는 점 때문에, 새로 설계한다면 SHA-1을 쓰는 v5를 권합니다.
사용 방법
- v3를 선택합니다 (이 페이지에서는 이미 선택되어 있습니다).
- 네임스페이스를 고릅니다. 기본값은 DNS입니다.
- 이름을 입력합니다. 예를 들어
example.com. - UUID 생성을 누릅니다. 같은 입력이면 결과도 같습니다.
사용 사례
- 외부 시스템이 정한 키에 안정적인 식별자를 붙일 때. 예를 들어 도메인이나 이메일 주소.
- 여러 서비스가 같은 입력에서 같은 UUID를 계산해야 하는 경우.
- MD5를 반드시 써야 한다고 규정된 기존 규격을 따를 때.
구조
MD5 해시 결과의 앞부분을 UUID로 옮기고, 13번째 16진수를 버전(3)으로, 17번째를 변형 번호로 고정합니다. 나머지 122비트는 모두 해시에서 나옵니다.
UUID v3의 역할
| 옵션 | 사용 시점 |
|---|---|
v3 | MD5 기반. 규격이 MD5를 요구할 때만 |
v5 | SHA-1 기반이라 같은 목적에 더 적합합니다 |
v4 | 입력과 무관한 난수 값이 필요할 때 |
UUID 버전 한눈에 보기
| 버전 | 정렬 가능 | 값의 출처 | 적합한 용도 |
|---|---|---|---|
| v1 | 불가능 | 타임스탬프 + MAC 주소 | v1을 계속 쓰는 기존 시스템 |
| v3 | 불가능 | 이름의 MD5 해시 | MD5를 꼭 써야 하는 결정적 식별자 |
| v4 | 불가능 | 122비트 난수 | 대부분의 일반적인 고유 식별자 |
| v5 | 불가능 | 이름의 SHA-1 해시 | 같은 이름에서 항상 같은 식별자가 필요할 때 |
| v6 | 가능 | 재배열한 타임스탬프 | 난수성과 정렬을 함께 원할 때 |
| v7 | 가능 | 밀리초 단위 Unix 시간 | 데이터베이스 기본 키와 이벤트 식별자 |
| v8 | 불가능 | 사용자 정의 비트 레이아웃 | 사내 형식과 실험적 용도 |
일곱 버전 모두 128비트이고, 모두 같은 8-4-4-4-12 표기법으로 표현합니다. 차이는 각 비트가 무엇을 담는지뿐입니다.
코드 예제
javascript
// MD5 구현이 필요합니다
// 예: js-md5 + 직접 조립
const id = uuidv3('example.com', NAMESPACE_DNS);
python
import uuid
id = str(uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com'))
java
UUID id = UUID.nameUUIDFromBytes("example.com".getBytes());
csharp
// .NET에는 v3 생성기가 없습니다
sql
-- 보통 애플리케이션에서 계산해 저장합니다
자주 묻는 질문
v3 결과가 항상 같은 게 정상인가요?
정상입니다. v3는 입력에서 결정되는 값이라 무작위성이 없습니다. 매번 다른 값이 필요하면 v4를 쓰세요.
v3와 v5 중 무엇을 써야 하나요?
새로 만든다면 v5를 권합니다. 둘의 구조는 같고 해시 함수만 다른데, MD5는 충돌 공격이 알려져 있습니다.
네임스페이스는 무엇인가요?
이름을 해시할 때 앞에 붙이는 고정 UUID입니다. RFC 4122는 DNS, URL, OID, X.500 네 가지를 정의해 두었고, 목적에 맞는 것을 고르면 됩니다.