본문으로 건너뛰기

ULID·NanoID 생성

ULID & NanoID Generator

정렬 가능한 ULID나 짧은 NanoID를 알파벳·길이를 정해 만들고 충돌 확률을 보여 줍니다.

ULID와 NanoID를 만듭니다. 36자짜리 UUID가 URL에 넣기엔 길 때 사람들이 집는 두 가지 짧은 id 형식입니다. 고른 길이와 알파벳에 대한 충돌 계산도 함께 보여 줍니다. 그 id가 충분히 짧은지 너무 짧은지는 그 숫자가 정합니다.

🔒 브라우저 안에서만 처리ulidnanoidgeneratorid
종류

26자, 정렬 가능. 앞 열 자리에 밀리초 타임스탬프가 들어 있습니다.

개수

id 0개

    충돌 확률

    엔트로피

    80.0비트

    1% 확률까지의 개수

    1.56e11

    시간당 1,000개일 때

    18천 년

    생일 문제 근사식: P ≈ 1 − exp(−n²/2N). 아래 숫자는 그 확률이 1%가 되는 지점입니다.

    ULID 뜯어보기

    ULID는 ULID 명세를 따릅니다. 밀리초 타임스탬프 48비트 뒤에 난수 80비트를, Crockford base32로 씁니다. I·L·O·U를 빼서 소리 내어 읽어도 헷갈리지 않게 한 표기입니다.

    사용 방법

    1. ULID와 NanoID 중에 고릅니다

      ULID는 26자 고정이고 앞 열 자리에 밀리초 타임스탬프가 있어 정렬됩니다. NanoID는 길이도 알파벳도 자유롭고 전부 엔트로피입니다. 순서라는 개념이 없습니다.

    2. 길이와 알파벳을 정합니다

      NanoID 기본값은 기호 64개로 21자입니다. 더 짧게 하거나 알파벳을 줄이면 — 예를 들어 사람이 소리 내어 읽을 것이라 헷갈리는 글자를 뺀 집합 — 엔트로피를 잃고, 아래 칸이 얼마나 잃는지 정확히 보여 줍니다.

    3. 충돌 줄을 읽습니다

      충돌 확률이 1%가 되기까지의 id 개수와, 하루 천 개를 뽑을 때 그게 얼마나 되는 기간인지 알려 줍니다. 엔트로피가 64비트 아래면 그 사실을 명시합니다. URL 슬러그와, 추측되면 안 되는 값 사이의 경계가 거기이기 때문입니다.

    4. ULID가 있으면 뜯어봅니다

      붙여넣으면 생성 시각과 뒤쪽 난수 부분을 보여 줍니다. 그 레코드가 실제로 언제 만들어졌는지 알아낼 때 씁니다.

    자주 묻는 질문

    짧은 id를 비밀 링크로 써도 되나요?

    엔트로피가 그렇다고 말할 때만입니다. 21자 NanoID는 126비트쯤이라 괜찮고, 10자짜리는 60비트쯤이라 돈을 좀 쓸 의향이 있는 사람에게는 추측됩니다. 64비트 아래를 따로 표시하는 게 그래서입니다. 짧은 id는 짧은 id일 뿐 비밀이 아닙니다.

    알파벳을 직접 지정해도 왜 고르게 나오나요?

    기호를 `random % length`가 아니라 거절 샘플링으로 뽑기 때문입니다. 나머지 연산으로 줄이면 길이가 256의 약수가 아닌 알파벳은 전부 편향됩니다. 직접 만든 id 생성기에서 흔한 버그이고, 누군가 세어 보기 전까지는 보이지 않습니다.

    ULID의 단조 증가는 뭘 하나요?

    같은 밀리초 안에서 만든 ULID들은 서로 순서가 뒤죽박죽입니다. 단조 증가를 켜면 난수 필드를 새로 뽑는 대신 하나씩 올려서, 같은 밀리초에 한꺼번에 만든 것들도 만든 순서대로 정렬됩니다.

    ULID의 base32는 왜 I·L·O·U를 빼나요?

    Crockford의 알파벳이라 그렇습니다. 사람이 소리 내어 읽거나 화면에서 옮겨 적을 때 헷갈리는 글자를 뺐습니다. 대가는 기호가 36개가 아니라 32개라는 것이고, 그래서 NanoID가 21자면 되는 자리에 ULID는 26자가 필요합니다.

    이 도구로 이어지는 것

    다음 단계

    이 도구의 결과를 그대로 받을 수 있는 도구들입니다.