ULID 생성기
정렬 가능한 고유 ID (Universally Unique Lexicographically Sortable Identifier)
📖 ULID 알파벳에 I, L, O, U가 없는 이유 가이드 보기
ULID 생성기란?
ULID(Universally Unique Lexicographically Sortable Identifier)는 26자리 Crockford Base32 인코딩 고유 ID입니다. 앞 10자리는 48비트 밀리초 타임스탬프, 뒤 16자리는 crypto.getRandomValues()로 얻은 10바이트(80비트) 난수를 5바이트씩 두 묶음(각 40비트 → Base32 8자)으로 인코딩한 값입니다. UUID와 달리 문자열 그대로 알파벳 정렬이 가능해 데이터베이스 인덱싱에 유리합니다.
자주 묻는 질문
ULID와 UUID의 차이는?
ULID는 타임스탬프 기반으로 정렬되지만, UUID v4는 완전 랜덤입니다. ULID는 삽입 순서를 유지해 B-트리 인덱스 단편화를 줄입니다.
ULID의 정렬은 어떻게 이루어지나요?
앞 10자리가 타임스탬프이므로 문자열 정렬 = 시간순 정렬입니다. 같은 밀리초 내 생성된 여러 ULID는 뒤 16자리 랜덤 부분의 값 순서로 정렬됩니다.
ULID는 UUID와 호환되나요?
네. 48비트 타임스탬프 + 80비트 랜덤 = 128비트로 UUID와 동일한 비트 수라서 UUID 필드에 그대로 저장할 수 있습니다. 일부 라이브러리가 상호 변환을 지원합니다.
Crockford Base32란?
숫자·영문 대문자를 섞은 32진법 인코딩으로, 육안으로 혼동하기 쉬운 문자를 제외합니다: I·L은 1과, O는 0과 헷갈리기 쉬워 빠졌고 U는 욕설 방지를 위해 제외되었습니다. 대소문자 구분 없이 디코딩할 수 있습니다.
ULID는 언제 사용하나요?
데이터베이스 기본키로 UUID 대신 사용하거나, 생성 시간순으로 정렬이 필요한 고유 ID가 필요할 때 사용합니다.
ULID 생성은 안전한가요?
네. 랜덤 부분은 crypto.getRandomValues()로 얻은 10바이트(80비트) 진짜 난수 전부를 사용합니다. 5바이트(40비트)씩 두 묶음으로 나눠 각각 Base32 8자로 인코딩해 총 16자(80비트)를 모두 랜덤 값에 반영하므로, 동일 밀리초 안에서도 280에 준하는 충돌 저항성을 가집니다.
NanoID와는 어떻게 다른가요?
NanoID는 크기가 작고 커스텀 알파벳을 지원하지만 정렬 불가입니다. ULID는 정렬 가능하고 타임스탬프를 내장합니다.
ULID의 최대 타임스탬프는?
48비트 타임스탬프로 2^48 - 1 ms, 즉 서기 10889년까지 표현 가능합니다.