UUID v5 개요
UUID v5는 v3와 구조가 같고 해시 함수만 SHA-1입니다. 네임스페이스와 이름을 이어 붙여 해시한 뒤 128비트로 정리하므로, 같은 입력에는 언제나 같은 UUID가 나옵니다.
MD5를 쓰는 v3보다 충돌 저항성이 낫기 때문에, 이름 기반 식별자가 필요할 때 RFC 9562가 권하는 쪽은 v5입니다.
사용 방법
- v5를 선택합니다 (이 페이지에서는 이미 선택되어 있습니다).
- 네임스페이스를 고릅니다. 기본값은 DNS입니다.
- 이름을 입력합니다. 예를 들어
example.com. - UUID 생성을 누릅니다. 입력이 같으면 결과도 같습니다.
사용 사례
- 도메인, URL, 이메일처럼 외부에서 정해진 키에 안정적인 ID를 붙일 때.
- 여러 서비스가 같은 입력에서 같은 UUID를 계산해야 할 때.
- 데이터 마이그레이션 중 기존 이름을 그대로 유지하며 식별자를 부여할 때.
구조
SHA-1 해시의 앞 128비트를 UUID로 옮기고, 13번째 16진수를 버전(5)으로, 17번째를 변형 번호로 고정합니다. 나머지 122비트는 해시에서 나옵니다.
UUID v5의 역할
| 옵션 | 사용 시점 |
|---|---|
v5 | 이름 기반 식별자의 권장 버전 |
v3 | 구조는 같지만 MD5라 새로 쓸 이유가 없습니다 |
v4 | 입력과 무관한 난수 값이 필요할 때 |
UUID 버전 한눈에 보기
| 버전 | 정렬 가능 | 값의 출처 | 적합한 용도 |
|---|---|---|---|
| v1 | 불가능 | 타임스탬프 + MAC 주소 | v1을 계속 쓰는 기존 시스템 |
| v3 | 불가능 | 이름의 MD5 해시 | MD5를 꼭 써야 하는 결정적 식별자 |
| v4 | 불가능 | 122비트 난수 | 대부분의 일반적인 고유 식별자 |
| v5 | 불가능 | 이름의 SHA-1 해시 | 같은 이름에서 항상 같은 식별자가 필요할 때 |
| v6 | 가능 | 재배열한 타임스탬프 | 난수성과 정렬을 함께 원할 때 |
| v7 | 가능 | 밀리초 단위 Unix 시간 | 데이터베이스 기본 키와 이벤트 식별자 |
| v8 | 불가능 | 사용자 정의 비트 레이아웃 | 사내 형식과 실험적 용도 |
일곱 버전 모두 128비트이고, 모두 같은 8-4-4-4-12 표기법으로 표현합니다. 차이는 각 비트가 무엇을 담는지뿐입니다.
코드 예제
javascript
// SHA-1 구현이 필요합니다
// 예: js-sha1 + 직접 조립
const id = uuidv5('example.com', NAMESPACE_DNS);
python
import uuid
id = str(uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com'))
java
// 라이브러리 없이는 직접 구현해야 합니다
csharp
// .NET에는 v5 생성기가 없습니다
sql
-- 보통 애플리케이션에서 계산해 저장합니다
자주 묻는 질문
v5와 v3의 차이는 무엇인가요?
해시 함수만 다릅니다. v5는 SHA-1, v3는 MD5를 씁니다. 나머지 구조와 동작 방식은 같습니다.
v5는 SHA-1을 쓰는데 안전한가요?
식별자를 만드는 용도로는 충분합니다. SHA-1의 충돌 문제는 서명이나 무결성 검증에서 문제가 되는데, v5는 값을 결정적으로 만들 뿐 보안을 보장하는 용도가 아닙니다.
같은 이름에 네임스페이스를 바꾸면 어떻게 되나요?
완전히 다른 UUID가 나옵니다. 네임스페이스도 해시 입력의 일부이기 때문에, 한 번 정한 조합은 바꾸지 않는 것이 좋습니다.