it-box

ULID 생성기

무작위 ULID(Universally Unique Lexicographically Sortable Identifier)를 생성합니다.

ULID 생성기 도구 열기

시각과 무작위 값으로 이루어진 ULID를 1개에서 100개까지 만들고, 줄바꿈 목록 또는 JSON 배열로 출력합니다.

사용 순서

  1. 수량 칸에 1에서 100 사이 숫자를 넣습니다.
  2. 형식을 Raw(줄바꿈 목록)나 JSON 중에서 고릅니다.
  3. Refresh를 눌러 새 값을 만들고 결과 상자를 확인합니다.
  4. Copy 버튼으로 결과를 복사합니다.

예시

생성된 ULID는 26자입니다. 앞 10자리가 01HF7YAT00이면 생성 시각은 2023-11-14 22:13:20 UTC이고, 뒤 16자리는 실행할 때마다 달라지는 무작위 값입니다.

한계

같은 밀리초에 만든 값끼리의 순서는 보장되지 않습니다. 단조 증가 옵션을 쓰지 않기 때문입니다. 시각은 기기 시계를 따르므로 시계가 틀리면 값에 담긴 시각도 틀립니다.

보안 주의

ULID의 앞 10자리에는 생성 시각이 그대로 들어가므로 언제 만들어졌는지가 값만 보고 드러납니다. 주문 번호나 사용자 식별자처럼 생성 시점이 노출되면 곤란한 곳에는 적합하지 않습니다.

배경 지식

ULID는 26자리 Crockford Base32 문자열로 된 식별자입니다. 앞 48비트는 밀리초 단위 시각이고, 뒤 80비트는 무작위 값입니다. 문자열을 사전순으로 정렬하면 대체로 생성 순서와 같아지기 때문에, 시간 순서대로 쌓이는 키가 필요한 곳에 씁니다. 로그 테이블이나 주문 목록처럼 시간 순 조회가 잦은 곳에서 특히 쓸모가 있습니다. 정렬 기준이 시간과 일치하므로 목록을 따로 정렬하지 않아도 됩니다.

UUID v4는 전체 인덱스에 고르게 흩어져 삽입되지만, ULID는 시간이 흐르면서 인덱스 뒤쪽에 쌓입니다. 그래서 데이터베이스 인덱스에 쓰기가 몰리는 방식이 달라집니다. Crockford Base32는 I, L, O, U를 빼서 헷갈리는 글자를 줄였고 대소문자를 구분하지 않아 손으로 옮겨 적기도 편합니다. 다만 시각 정보가 들어 있으므로 UUID처럼 완전히 추측 불가능한 값이 필요한 곳과는 목적이 다릅니다.

자주 묻는 질문

ULID만으로 기본 키를 정하면 되나요?

정렬과 인덱스 측면에서는 좋은 선택입니다. 다만 값이 시각을 드러내므로 외부에 노출되는 식별자로 쓸 때는 별도 공개용 값을 두는 편이 안전합니다.

같은 밀리초에 여러 개를 만들면 순서가 바뀔 수 있나요?

그럴 수 있습니다. 같은 시각 부분 안에서는 무작위 부분이 순서를 정하므로 생성 순서와 문자열 순서가 어긋납니다. 엄격한 순서가 필요하면 단조 증가 방식을 쓰는 라이브러리를 고르세요.

UUID와 ULID의 길이가 다른 이유는 무엇인가요?

UUID는 128비트를 16진수 36자(하이픈 포함)로 적고, ULID는 같은 128비트를 Base32 26자로 적습니다. 저장 크기는 같지만 ULID는 글자 종류가 적어 URL에 넣기 편합니다.