UUID 검증 개요
UUID는 길이만 맞으면 유효해 보이지만, 실제로는 13번째 자리의 버전 번호와 17번째 자리의 변형 번호까지 규격에 맞아야 합니다. 이 도구는 그 두 자리를 확인해 버전과 변형을 알려줍니다.
v1, v6, v7처럼 값 안에 시각이 들어 있는 버전은 그 타임스탬프를 풀어 보여줍니다. 로그에서 값만 보고 언제 만들어진 것인지 확인할 때 쓸모가 있습니다.
사용 방법
- 한 줄에 하나씩 붙여넣습니다. 최대 200줄입니다.
- 중괄호, 따옴표, 하이픈 없는 형식, 대문자 모두 그대로 넣어도 됩니다.
- 검증을 누르면 줄마다 유효 여부와 버전이 표시됩니다.
- 타임스탬프가 있는 버전은 해당 시각도 함께 보여줍니다.
사용 사례
- 운영 데이터에 섞여 들어간 잘못된 값 찾아내기.
- 로그에 찍힌 UUID가 언제 생성된 것인지 역추적.
- 마이그레이션 전에 기존 컬럼 값이 규격에 맞는지 일괄 점검.
구조
13번째 16진수가 버전을, 17번째가 변형을 나타냅니다. 이 두 자리가 규격을 벗어나면 UUID 형식은 맞아도 유효하지 않은 값으로 처리합니다.
UUID 검증의 역할
| 옵션 | 사용 시점 |
|---|---|
검증 | 여러 값을 한 번에 확인하고 시각까지 읽어냅니다 |
형식 변환 | 같은 값을 다른 표기법으로 바꿀 때 |
UUID v4 | 유효한 값을 새로 만들 때 |
UUID 버전 한눈에 보기
| 버전 | 정렬 가능 | 값의 출처 | 적합한 용도 |
|---|---|---|---|
| v1 | 불가능 | 타임스탬프 + MAC 주소 | v1을 계속 쓰는 기존 시스템 |
| v3 | 불가능 | 이름의 MD5 해시 | MD5를 꼭 써야 하는 결정적 식별자 |
| v4 | 불가능 | 122비트 난수 | 대부분의 일반적인 고유 식별자 |
| v5 | 불가능 | 이름의 SHA-1 해시 | 같은 이름에서 항상 같은 식별자가 필요할 때 |
| v6 | 가능 | 재배열한 타임스탬프 | 난수성과 정렬을 함께 원할 때 |
| v7 | 가능 | 밀리초 단위 Unix 시간 | 데이터베이스 기본 키와 이벤트 식별자 |
| v8 | 불가능 | 사용자 정의 비트 레이아웃 | 사내 형식과 실험적 용도 |
일곱 버전 모두 128비트이고, 모두 같은 8-4-4-4-12 표기법으로 표현합니다. 차이는 각 비트가 무엇을 담는지뿐입니다.
코드 예제
javascript
const re = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
console.log(re.test(id));
python
import uuid
try:
u = uuid.UUID(value)
print(u.version, u.variant)
except ValueError:
print('invalid')
java
try {
UUID u = UUID.fromString(value);
System.out.println(u.version());
} catch (IllegalArgumentException e) {
System.out.println("invalid");
}
csharp
if (Guid.TryParse(value, out var g))
Console.WriteLine("valid");
sql
-- PostgreSQL 13+
SELECT value, value::uuid AS parsed
FROM raw_ids
WHERE value ~ '^[0-9a-f]{8}-';
자주 묻는 질문
왜 어떤 값은 유효한데 버전이 0으로 나오나요?
Nil UUID처럼 모든 비트가 0인 값이나, 버전 자리에 규격에 없는 숫자가 들어간 값입니다. 형식은 맞지만 특정 버전에 속하지 않습니다.
타임스탬프는 왜 일부 버전에서만 보이나요?
v1, v6, v7만 값 안에 시각을 담습니다. v4는 전부 난수이고 v3, v5는 이름의 해시라서 시각 정보가 없습니다.
200줄을 넘으면 어떻게 되나요?
앞 200줄만 처리하고 나머지는 무시합니다. 그 이상은 파일로 나눠서 확인하세요.