ULID 생성기

타임스탬프와 무작위성을 포함한 사전식 정렬 가능 식별자 생성

다음 예시를 시도해보세요:

ULID란?

ULID (범용 고유 사전식 정렬 식별자) UUID의 한계를 극복하기 위해 설계된 128비트 식별자 형식입니다. 구성 요소는 다음과 같습니다:

  • Timestamp: 48비트 밀리초 정밀도의 Unix 시간
  • Randomness: 80비트의 암호학적으로 안전한 무작위 데이터
  • Encoding: Base32 표현(26자)

형식 예시: 01ARZ3NDEKTSV4RRFFQ69G5FAV

ULID 작동 방식

  1. 타임스탬프(밀리초 단위 Unix 시간)용 48비트 생성
  2. 암호학적으로 안전한 80비트 무작위 데이터 생성
  3. 타임스탬프(가장 중요한 부분)와 무작위성(가장 덜 중요한 부분) 결합
  4. Crockford의 Base32 알파벳을 사용해 전체 128비트 값을 인코딩
  5. 결과는 26자 문자열(처음 10자는 타임스탬프, 마지막 16자는 무작위성)

장점 및 고려사항

AdvantagesConsiderations
  • 사전식 정렬 가능
  • URL 안전 문자 집합
  • 특별한 인코딩 불필요
  • Case-insensitive
  • 개인정보 문제 없음
  • 새롭고 덜 널리 사용됨
  • 제한된 라이브러리 지원
  • UUID 호환성 없음
  • 1970년 이전으로 돌아갈 수 없음

ULID 구조

ComponentBitsCharactersDescription
Timestamp48비트10자Base32로 인코딩된 Unix 타임스탬프(밀리초)
Randomness80비트16자Base32로 인코딩된 무작위 바이트

ULID와 UUID 비교

FeatureULIDUUID v1UUID v4UUID v7
Size128비트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 알파벳

인코딩 값CharacterNotes
0-90-9십진수 숫자
10-31A-Z가독성을 위해 I, L, O, U 제외

문자: 0123456789ABCDEFGHJKMNPQRSTVWXYZ

이 인코딩은 디코딩 시 대소문자를 구분하지 않지만(ULID는 일반적으로 대문자로 생성됨)