Oh MyUtils

ULID 생성기 - 정렬 가능한 고유 ID 생성 온라인

ULID를 생성하고, 타임스탬프를 추출하고, ULID와 UUID 형식 간 변환하세요. 단조 증가 생성으로 엄격한 순서 보장 — 100% 클라이언트 사이드, 서버 전송 없음.

단조 증가
대문자

대량 생성

수량

자주 묻는 질문

ULID란 무엇인가요?

ULID(Universally Unique Lexicographically Sortable Identifier)는 Crockford의 Base32로 인코딩된 26자리 문자열의 128비트 식별자입니다. 기존 UUID와 달리, ULID는 처음 10자리에 48비트 Unix 타임스탬프(밀리초 단위)를 포함하고, 나머지 16자리에 80비트의 암호학적 랜덤 값을 포함합니다. 이 설계 덕분에 ULID는 생성 시간순으로 사전식 정렬이 가능하면서도 전역 고유성을 유지합니다.

이 ULID 생성기는 어떻게 사용하나요?

생성 탭에서 단일 또는 대량 ULID(최대 1000개)를 생성할 수 있습니다. 같은 밀리초 내에서 엄격한 순서를 보장하려면 단조(Monotonic) 모드를 활성화하세요. 디코드 탭에서는 ULID를 붙여넣어 내장된 타임스탬프(ISO 8601, Unix 밀리초, 로컬 시간)를 추출할 수 있습니다. 변환 탭에서는 ULID와 UUID 형식을 상호 변환할 수 있습니다. 복사 버튼을 클릭하여 결과를 클립보드에 복사하세요.

데이터는 안전한가요? 서버로 전송되는 것이 있나요?

모든 작업은 Web Crypto API(crypto.getRandomValues())를 사용하여 100% 브라우저에서 수행됩니다. ULID 데이터, 타임스탬프, UUID가 서버로 전송되거나, 데이터베이스에 저장되거나, 어디에도 기록되지 않습니다. 인터넷 연결을 끊어도 도구가 완전히 작동하는 것으로 확인할 수 있습니다.

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

둘 다 128비트 식별자이지만 주요 차이점이 있습니다. ULID는 26자(Crockford의 Base32), UUID는 36자(하이픈 포함 16진수)입니다. ULID는 생성 시간순으로 사전식 정렬이 가능하지만, UUID(v4)는 무작위 순서입니다. ULID는 특수 문자가 없어 URL에 안전합니다. 둘 다 128비트 값이므로 ULID와 UUID 간 상호 변환이 가능합니다.

단조(Monotonic) ULID 생성이란 무엇인가요?

같은 밀리초 내에 여러 ULID를 생성할 때, 표준 생성 방식은 매번 랜덤 값을 할당하므로 순서가 보장되지 않을 수 있습니다. 단조 생성은 같은 밀리초 내에서 생성되는 각 ULID의 랜덤 구성 요소를 1씩 증가시켜 엄격한 사전식 순서를 보장합니다. 이는 ID 순서에 의존하는 데이터베이스 시스템에서 매우 중요합니다.

UUID 대신 ULID를 언제 사용해야 하나요?

별도의 타임스탬프 컬럼 없이 시간순 정렬이 필요한 식별자, 더 나은 데이터베이스 인덱스 성능(B-tree 친화적), 더 짧은 문자열 표현(26자 vs 36자), URL에 안전한 식별자가 필요할 때 ULID를 사용하세요. 최대한의 생태계 호환성, RFC 준수, 내장된 버전/변형 메타데이터가 필요할 때는 UUID를 사용하세요.

코드 예제

// Crockford's Base32 alphabet
const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';

// Generate a ULID
function generateULID() {
  const timestamp = Date.now();
  let ts = timestamp;
  let timestampPart = '';
  for (let i = 9; i >= 0; i--) {
    timestampPart = ENCODING[ts % 32] + timestampPart;
    ts = Math.floor(ts / 32);
  }

  const randomBytes = new Uint8Array(10);
  crypto.getRandomValues(randomBytes);
  const bits = Array.from(randomBytes)
    .map(b => b.toString(2).padStart(8, '0')).join('');
  let randomPart = '';
  for (let i = 0; i < 16; i++) {
    randomPart += ENCODING[parseInt(bits.slice(i*5, i*5+5), 2)];
  }

  return timestampPart + randomPart;
}

console.log(generateULID()); // "01ARZ3NDEKTSV4RRFFQ69G5FAV"

관련 도구