ULID 생성기

ULID(Universally Unique Lexicographically Sortable Identifier)를 온라인으로 생성. 단건 또는 일괄(최대 100개). 타임스탬프와 무작위 부분 표시. ULID 디코더 내장. 브라우저에서 처리.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요

ULID를 생성하거나 하나를 디코딩하면 결과가 표시됩니다.

자세한 가이드 읽기 ULID 생성기: ULID란 무엇이며 정렬에서 UUID보다 왜 뛰어난가
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

ULID 구조

01ARZ3NDEKTSV4RRFFQ69G5FAV
├─ 타임스탬프 (10자) ──┤├── 무작위 부분 (16자) ──┤
 48비트 밀리초 타임스탬프    80비트: 난수, 또는 같은 밀리초 안에서 직전 값 + 1

한 글자가 5비트를 나타내며, 쓰는 문자는 Crockford Base32의 0123456789ABCDEFGHJKMNPQRSTVWXYZ입니다. 10자는 50비트라서 48비트 타임스탬프보다 2비트가 남고, 그래서 첫 글자는 0~7만 올 수 있습니다.

한국 시간으로 오전 9시에 만든 ULID

한글날인 2026년 10월 9일 오전 9시 정각(한국 시간)에 서비스가 ULID 3개를 만들었다고 해 봅시다. 이 순간은 UTC로 같은 날 0시입니다. 도구와 같은 생성 함수에 난수 대신 고정된 바이트를 넣어 재현하면 다음과 같습니다.

  • 01M4EZB9001727P4AYGCQTDM1V
  • 01M4EZB9001727P4AYGCQTDM1W
  • 01M4EZB9001727P4AYGCQTDM1X

세 값 모두 앞 10자가 01M4EZB900으로 같고, 무작위 부분은 마지막 글자만 하나씩 커집니다. 직접 생성 버튼을 누르면 무작위 부분은 매번 달라지지만, 같은 밀리초에 만든 값이 이렇게 1씩 늘어나는 규칙은 같습니다.

첫 번째 값 01M4EZB9001727P4AYGCQTDM1V를 디코더에 붙여넣으면 이렇게 표시됩니다.

  • 타임스탬프: 2026-10-09 00:00:00.000 UTC
  • 밀리초 (epoch): 1791504000000
  • 한국 시간(Asia/Seoul)으로 바꾸면: 2026-10-09 09:00:00.000

도구는 UTC만 보여 주므로 시각이 0시로 보입니다. 로그나 고객 문의에 적힌 한국 시간과 맞춰 볼 때는 9시간을 더해서 비교하세요. 밀리초 값을 타임스탬프 변환기에 붙여넣으면 브라우저의 시간대로 볼 수도 있습니다. 한국 시간 오전 9시 이전에 만든 ULID는 UTC 날짜가 한국 날짜보다 하루 이르게 보인다는 점도 기억해 두면 좋습니다.

디코더가 거부하는 입력

디코더는 앞뒤 공백을 지우고 소문자를 대문자로 바꾼 뒤 26자를 검사합니다. 소문자로 저장된 ULID는 그대로 붙여넣어도 됩니다. 그러나 다음 두 경우는 결과 대신 오류 문구가 나옵니다.

첫 글자가 7보다 큰 8ZZZZZZZZZZZZZZZZZZZZZZZZZ를 넣으면 범위를 벗어났습니다: 첫 글자는 0–7이어야 합니다(가장 큰 ULID는 7ZZZZZZZZZZZZZZZZZZZZZZZZZ)가 표시됩니다. 128비트에 들어가지 않는 값이기 때문입니다.

끝에서 두 번째 글자 1을 영문 I로 잘못 옮긴 01M4EZB9001727P4AYGCQTDMIV는 유효하지 않은 ULID입니다. Crockford의 Base32 설명은 디코딩할 때 I와 L을 1로, O를 0으로 읽어도 된다고 하지만, 이 도구는 추측해서 바꾸지 않고 오류로 처리합니다.

ULID vs UUID 비교

특성ULIDUUID v4
길이26자36자 (대시 포함)
정렬 가능✓ 예✗ 아니오
타임스탬프 내장✓ 예✗ 아니오
URL 안전✓ 예✓ 예
대소문자 구분 없음✓ 예✓ 예
랜덤 비트80비트122비트

UUID 버전 7(RFC 9562 5.7절)도 48비트 밀리초 타임스탬프로 시작하며 데이터베이스의 uuid 형식에 바로 저장할 수 있습니다. ULID는 보통 26자 문자열이나 디코딩한 16바이트로 저장합니다. 두 방식 모두 ID를 본 사람이 생성 시각을 알 수 있으므로, 공개 URL에서 생성 시각을 숨겨야 한다면 무작위 UUID v4를 쓰세요.

제한

  • 한 번에 최대 100개까지 생성합니다. 100보다 크면 100, 1보다 작거나 비어 있거나 숫자가 아니면 1로 처리합니다.
  • 디코더는 알파벳 32자만 받습니다. I, L, O, U는 자동으로 바꾸지 않고 오류로 처리합니다.
  • 디코딩 결과는 UTC 날짜·시각과 밀리초뿐이며, 한국 시간 변환이나 무작위 부분 해석은 하지 않습니다.
  • 소문자 출력, UUID 형식이나 16바이트로 바꾸는 기능은 없습니다.
  • 같은 밀리초 안에서 무작위 부분이 ZZZZZZZZZZZZZZZZ에 이르면 처음으로 돌아가지 않고 넘침 메시지와 함께 멈춥니다. 무작위 값에서 시작하므로 실제로는 279개 정도를 만들어야 일어납니다.

관련 도구

FAQ

ULID란 무엇인가요?

ULID(Universally Unique Lexicographically Sortable Identifier)는 Crockford Base32 문자 26자로 표현하는 128비트 식별자입니다. UUID v4와 달리 문자열로 사전순 정렬하면 그대로 생성 순서가 됩니다. 앞 10자는 48비트 밀리초 타임스탬프, 나머지 16자는 80비트 무작위 부분입니다.

ULID의 구조는 어떻게 되나요?

ULID는 26자입니다. 앞 10자는 타임스탬프(48비트, 밀리초 정밀도, 서기 10889년까지 표현 가능)이고, 나머지 16자는 crypto.getRandomValues에서 얻은 80비트 무작위 부분입니다. 다만 같은 밀리초 안에서 만드는 다음 ULID는 바로 앞 무작위 부분에 1을 더한 값입니다. 인코딩은 Crockford Base32(0-9와 A-Z에서 I, L, O, U를 뺀 32자)입니다.

ULID와 UUID의 차이점은 무엇인가요?

UUID v4는 완전히 무작위라 생성 순서대로 정렬되지 않습니다. ULID는 사전순이 곧 생성 순서이므로 데이터베이스 기본 키에 잘 맞습니다. 순서대로 삽입되어 B-트리 페이지 분할이 줄고 범위 조회도 빨라집니다. ULID는 URL에 그대로 쓸 수 있고 대소문자를 구분하지 않습니다.

ULID 디코더는 무엇에 사용하나요?

기존 ULID를 붙여넣으면 생성 시각을 꺼낼 수 있습니다. 별도의 created_at 컬럼 없이 ID에서 레코드 생성 시각을 확인할 수 있어 디버깅에 유용합니다. 대소문자 모두 읽으며, 첫 글자가 7보다 큰 ULID는 오류로 처리합니다. 가장 큰 ULID는 7ZZZZZZZZZZZZZZZZZZZZZZZZZ이고 그보다 큰 값은 128비트에 들어가지 않습니다(ULID 사양 'Overflow Errors when Parsing Base32 Strings').

한 번에 생성한 ULID는 순서대로 나열되나요?

네. 일괄 생성은 보통 같은 밀리초 안에 끝나므로 타임스탬프가 같습니다. ULID 사양의 단조성(Monotonicity) 절에 따라 두 번째부터는 바로 앞 값의 무작위 부분에 1을 더해 만들기 때문에 목록이 이미 사전순입니다(…EMMVRZ 다음은 …EMMVS0). 밀리초가 바뀌면 새 난수에서 시작합니다. 같은 밀리초 안에서 무작위 부분이 ZZZZZZZZZZZZZZZZ를 넘으려 하면 처음으로 돌아가지 않고 오류로 멈춥니다.

생성하거나 디코딩한 ULID가 어딘가로 전송되거나 저장되나요?

아니요. 생성에는 브라우저의 Web Crypto API(crypto.getRandomValues)와 Date.now()를 쓰고, 디코딩도 같은 페이지 안에서 처리합니다. 생성하거나 붙여넣은 ULID는 ZeroTool로 전송되지 않으며, 페이지를 떠나면 ULID도 설정도 남지 않습니다. 페이지의 Google Analytics는 어떤 동작(생성, 디코딩, 복사)을 했는지만 기록하고 ULID 값은 포함하지 않습니다.