ULID 생성

UUID의 대안으로 사용할 수 있는, 시간순으로 정렬 가능한 ID인 「ULID」를 한 번에 생성합니다.

ULID 생성이란

ULID 생성이란 시각순으로 정렬 가능한 글로벌 고유 식별자 ‘ULID(Universally Unique Lexicographically Sortable Identifier)’를 한꺼번에 발행하는 일입니다. ULID는 26자의 Crockford Base32 문자열로, 앞 10자가 생성 시각을 나타내는 타임스탬프부, 나머지 16자가 암호학적으로 안전한 난수에 의한 랜덤부로 구성되어 있습니다. UUID v4 같은 완전 무작위 식별자와 달리, 생성한 순서대로 문자열로서 정렬할 수 있다는 점이 가장 큰 특징입니다.

이 도구는 Web Crypto API의 crypto.getRandomValues()를 사용해 랜덤부를 생성하므로, 유사난수가 아니라 암호학적으로 안전한 난수원을 이용합니다. 생성 처리는 모두 브라우저 안에서 끝나며, 입력하신 건수나 생성 결과가 서버로 전송되는 일은 없습니다. 한 번에 최대 1,000건까지 한꺼번에 생성할 수 있고, 대문자(사양상의 정준 표기)와 소문자 어느 쪽 출력에도 대응합니다.

ULID 생성 사용 방법

  1. 생성 건수를 입력합니다 한 번에 발행하고 싶은 ULID의 개수를 ‘생성 건수’에 입력합니다. 1~1000건의 범위에서 지정하실 수 있습니다.
  2. 소문자 표시의 필요 여부를 고릅니다 URL이나 로그에 삽입할 때 소문자로 통일하고 싶으시면 ‘소문자로 출력’에 체크합니다. 사양상은 대문자·소문자 어느 쪽도 유효한 표기입니다.
  3. ‘생성하기’ 버튼을 누릅니다 버튼을 누르면 현재 시각을 타임스탬프부에 사용한 ULID가 지정 건수만큼 한꺼번에 목록으로 표시됩니다.
  4. 결과를 복사합니다 1건씩의 ‘복사’, 또는 목록 전체를 줄바꿈으로 구분해 한꺼번에 복사하는 ‘전체 복사’를 쓰실 수 있습니다.

더 잘 활용하기 위한 팁

  • ULID는 앞의 10자리가 타임스탬프(생성 시각)이고 나머지 16자리는 무작위 값으로 구성됩니다. 같은 밀리초 내에 생성된 경우가 아니라면, 문자열로 정렬하는 것만으로도 생성 시각 순서대로 나열할 수 있습니다.
  • 데이터베이스의 기본 키에 완전히 무작위인 UUID v4를 사용하면 인덱스 삽입 위치가 무작위가 되어 B-tree 인덱스의 단편화가 진행되기 쉽지만, ULID는 시간순으로 정렬되므로 삽입 위치가 대체로 연속적이어서 이 문제를 완화할 수 있습니다.
  • ULID는 26자의 Crockford Base32(`0`-`9`, `A`-`Z`에서 혼동하기 쉬운 I·L·O·U를 제외한 32개 문자)로 표현되기 때문에 UUID(하이픈을 포함해 36자)보다 짧고, 대소문자를 구분하지 않는 환경에서도 안전하게 다룰 수 있습니다.
  • Nano ID·UUID v4와의 형식 비교는 자매 도구인 Nano ID 생성 페이지에 실린 비교표도 함께 참고해 보세요.

ULID 생성이 도움이 되는 상황

데이터베이스의 기본 키·레코드 ID 발행

신규 테이블의 기본 키에 ULID를 채용할 때, 개발 초기에 테스트용 더미 레코드나 시드 데이터에 넣을 ID를 한꺼번에 준비하실 수 있습니다.

이벤트 기반 시스템의 이벤트 ID

메시지 큐나 분산 시스템에서 이벤트마다 고유한 ID를 부여할 경우, 시각순으로 늘어서는 ULID라면 로그를 시계열로 따라가기 쉬워집니다.

로그·트레이스 ID의 샘플 작성

애플리케이션의 로그 기반이나 트레이싱 도구의 동작 확인·데모용 데이터로서, 실제 형식에 맞는 ID를 바로 준비하실 수 있습니다.

다른 형식의 ID와의 비교 검토

UUID v4나 UUID v7, 단축 URL용 Nano ID와 망설이고 계신다면, 실제 모양과 글자 수를 견주어 본 뒤 채용을 판단하실 수 있습니다. 비교는 UUID 생성·UUID v7 생성·Nano ID 생성의 각 도구도 함께 이용해 주세요.

ULID 생성의 관련 용어

ULID
Universally Unique Lexicographically Sortable Identifier의 약자. 128비트의 고유 식별자이면서, 앞 48비트에 생성 시각을 가지므로 문자열로서 정렬하기만 하면 시계열 순으로 늘어놓을 수 있는 규격입니다.
Crockford Base32
숫자 0~9와 알파벳 A~Z에서, 겉모습이 헷갈리기 쉬운 I·L·O·U의 네 글자를 뺀 32자로 구성되는 인코딩 방식입니다. ULID는 이 방식으로 26자에 부호화됩니다.
단조성(monotonicity)
값이 시간과 함께 항상 계속 증가하는 성질입니다. ULID는 같은 밀리초 안에 여럿 생성하면 순서가 보장되지 않지만, 사양이 정하는 모노토닉 생성의 확장 구현을 쓰면 동일 밀리초 안에서도 단조 증가를 유지할 수 있습니다.
UUID
Universally Unique Identifier의 약자. RFC 4122에서 규정된 128비트 고유 식별자의 규격으로, 36자(하이픈 포함)의 16진수 표기가 쓰입니다. ULID와는 독립된 별개의 규격입니다.
분산 시스템에서의 고유 ID
여러 서버나 프로세스가 중앙의 채번기에 문의하지 않고, 각자 독립적으로 중복되지 않는 식별자를 생성할 수 있는 구조입니다. ULID나 UUID는 이 용도를 위해 생성 시각과 난수를 조합해 충돌 확률을 극소화하고 있습니다.
타임스탬프부
ULID의 앞 10자에 해당하는 부분으로, 생성 시각을 밀리초 단위로 Crockford Base32에 인코딩한 48비트의 값입니다. 문자열 비교만으로 생성 순서를 알 수 있는 구조의 핵심이 되는 부분입니다.

자주 묻는 질문

ULID(Universally Unique Lexicographically Sortable Identifier)는 UUID와 마찬가지로 전역적으로 고유한 ID를 생성하는 규격이면서도, 생성 시각 정보를 포함하고 있어 문자열로 정렬하는 것만으로 시간순으로 나열할 수 있다는 특징을 가진 식별자 표준입니다.

가장 큰 차이는 「생성 시각순으로 정렬할 수 있는지」입니다. UUID v4는 완전히 무작위인 128비트 값이라 생성 순서대로 정렬할 수 없지만, ULID는 앞의 48비트가 밀리초 단위의 타임스탬프이므로 문자열 비교만으로 생성 순서를 알 수 있습니다. 표기 방식도 ULID는 26자의 Base32, UUID는 36자(하이픈 포함)의 16진수라는 차이가 있습니다.

UUID v4처럼 완전히 무작위인 값을 기본 키로 사용하면 새 행이 삽입되는 위치가 인덱스 내에서 무작위가 되어 B-tree 인덱스의 단편화나 캐시 효율 저하를 초래할 수 있습니다. ULID는 시간순으로 정렬되는 특성이 있어 새 행이 인덱스 끝부분 근처에 추가되기 쉬우므로, 이 문제를 완화할 수 있다고 알려져 있습니다.

앞의 10자는 48비트의 밀리초 타임스탬프(서기 약 10889년까지 표현 가능)이고, 나머지 16자는 80비트의 무작위 값입니다. 합계 128비트로 UUID와 같은 비트 수를 가지면서도 시각 정보를 내포하고 있다는 점이 ULID의 특징입니다.
툴군

여담 ― ID의 세계에 「시간순」을 가져온 ULID

ULID 규격은 2016년 Alizain Feerasta에 의해 공개되었습니다. 당시 이미 UUID는 분산 시스템에서 고유 ID를 생성하는 표준적인 수단으로 널리 쓰이고 있었지만, 「완전히 무작위여서 정렬할 수 없다」는 특성이 데이터베이스 인덱스 효율이나 로그의 시계열 분석에서 불편하다는 문제의식에서 탄생했다고 알려져 있습니다.

UUID에도 사실 버전 1(MAC 주소+타임스탬프)이나 2024년에 표준화된 버전 7(타임스탬프+무작위 값의 조합)처럼 시간 정보를 포함하는 변형이 존재합니다. 하지만 ULID는 UUID 규격(RFC 4122)과는 독립적인 별도의 표준으로서, 더 단순한 설계와 Base32를 이용한 간결한 표기를 추구했다는 점에 특징이 있습니다.

오늘날 ULID는 주요 프로그래밍 언어 대부분에 구현 라이브러리가 존재하며, 분산 시스템의 이벤트 ID·로그의 추적 ID·데이터베이스 기본 키 등 생성 순서를 유지하고 싶은 상황에서 널리 채택되고 있습니다. 비슷한 시기에 등장한 UUID v7과 설계 사상이 겹치는 부분도 많아, 두 규격은 「정렬 가능한 UUID 계열 식별자」라는 같은 과제에 대한 서로 다른 접근 방식으로 공존하고 있습니다.