ULID 생성

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

사용 팁

  • 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(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 계열 식별자」라는 같은 과제에 대한 서로 다른 접근 방식으로 공존하고 있습니다.