ULID란?
ULID (범용 고유 사전식 정렬 식별자) UUID의 한계를 극복하기 위해 설계된 128비트 식별자 형식입니다. 구성 요소는 다음과 같습니다:
- Timestamp: 48비트 밀리초 정밀도의 Unix 시간
- Randomness: 80비트의 암호학적으로 안전한 무작위 데이터
- Encoding: Base32 표현(26자)
형식 예시: 01ARZ3NDEKTSV4RRFFQ69G5FAV
ULID 작동 방식
- 타임스탬프(밀리초 단위 Unix 시간)용 48비트 생성
- 암호학적으로 안전한 80비트 무작위 데이터 생성
- 타임스탬프(가장 중요한 부분)와 무작위성(가장 덜 중요한 부분) 결합
- Crockford의 Base32 알파벳을 사용해 전체 128비트 값을 인코딩
- 결과는 26자 문자열(처음 10자는 타임스탬프, 마지막 16자는 무작위성)
장점 및 고려사항
Advantages | Considerations |
---|---|
|
|
ULID 구조
Component | Bits | Characters | Description |
---|---|---|---|
Timestamp | 48비트 | 10자 | Base32로 인코딩된 Unix 타임스탬프(밀리초) |
Randomness | 80비트 | 16자 | Base32로 인코딩된 무작위 바이트 |
ULID와 UUID 비교
Feature | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Size | 128비트 | 128비트 | 128비트 | 128비트 |
문자열 길이 | 26자 | 36자 | 36자 | 36자 |
Time-based | ✅ | ✅ | ❌ | ✅ |
자연 정렬 | ✅ | ❌ | ❌ | ✅ |
URL 안전 | ✅ | ❌ | ❌ | ❌ |
MAC 주소 노출 | ❌ | ✅ | ❌ | ❌ |
무작위 구성 요소 | ✅ | ❌ | ✅ | ✅ |
표준 규격 | ❌ | ✅ | ✅ | ⚠️ 초안 |
일반 사용 사례
- 데이터베이스 기본 키: 성능 최적화된 인덱스
- 분산 시스템: 조정 없는 생성
- APIs: 깔끔하고 URL 안전한 식별자
- 시계열 데이터: 고유한 시간 순서 정렬
- 로그 시스템: 정렬 가능한 이벤트 식별자
- 현대 애플리케이션: UUID 한계가 문제되는 곳
왜 ULID를 선택해야 하나요?
- Sortability: 생성 시간에 따라 사전식 정렬
- URL 안전성: URL 인코딩 불필요(하이픈이 있는 UUID와 달리)
- Compactness: 26자 대 36자(UUID)
- 대소문자 구분 없음: 사용자 입력 오류 감소
- Monotonicity: 동일 밀리초 내에서 선택적 단조 정렬
- 특수 문자 없음: 간단하고 영숫자만 포함된 형식
자주 묻는 질문
ULID는 UUID v7과 어떻게 비교되나요?
둘 다 정렬 가능성을 위해 Unix 타임스탬프를 사용하며 무작위 구성 요소를 포함합니다. 주요 차이점은 인코딩(Base32 대 16진수), 형식(26자 대 36자), 그리고 표준화(UUID v7은 RFC 초안 명세에 있음)입니다.
ULID에서 생성 시간을 추출할 수 있나요?
예. 처음 10자는 밀리초 정밀도의 Unix 타임스탬프를 나타내며, 이를 디코딩하여 표준 날짜/시간으로 변환할 수 있습니다.
ULID는 UUID 데이터베이스 필드와 호환되나요?
아니요. ULID는 다른 형식을 사용하므로 네이티브 UUID 데이터베이스 타입 대신 문자열이나 바이너리 데이터로 저장해야 합니다.
ULID에서 단조성이란 무엇인가요?
일부 ULID 구현은 동일 타임스탬프 내에서 생성된 ULID의 무작위 구성 요소를 증가시켜 순차적 정렬 순서를 보장하는 단조 옵션을 제공합니다.
ULID는 어떤 문자 집합을 사용하나요?
ULID는 Crockford의 Base32 인코딩(0-9, I, L, O, U를 제외한 A-Z)을 사용하며, 이는 ID를 수동으로 읽거나 입력할 때 혼동과 전사 오류를 최소화하도록 설계되었습니다.
Resources
Crockford의 Base32 알파벳
인코딩 값 | Character | Notes |
---|---|---|
0-9 | 0-9 | 십진수 숫자 |
10-31 | A-Z | 가독성을 위해 I, L, O, U 제외 |
문자: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
이 인코딩은 디코딩 시 대소문자를 구분하지 않지만(ULID는 일반적으로 대문자로 생성됨)