도구스개발

ID 충돌 확률 계산기

UUID·nanoid 같은 랜덤 ID를 몇 개까지 만들어도 안전한지 생일 문제로 계산합니다. 길이를 줄였을 때의 위험도 함께 봅니다.

128비트 중 버전 4비트·변형 2비트가 고정이라 무작위는 122비트입니다.

122.0비트 · 값이 5.32×10^36가지

10^-19.0 (1063.4경분의 1)

10억개를 만들었을 때 같은 값이 두 번 나올 확률입니다. 50%가 되는 것은 271.5경개부터입니다.

무작위 비트122.00 비트
가능한 값의 수5.32×10^36 가지
충돌 확률10^-19.0 (1063.4경분의 1)
확률이 50%가 되는 개수271.5경 개
1조 개를 만들면10^-13.0 (10.6조분의 1)

개수별 충돌 확률

100만10^-25.0 (1.06×10^25분의 1)
10억10^-19.0 (1063.4경분의 1)
1조10^-13.0 (10.6조분의 1)
1000조10^-7.0 (1063.4만분의 1)

이 확률을 넘지 않으려면 몇 개까지

충돌 확률 100만 분의 1 이하3261조
충돌 확률 10억 분의 1 이하103.1조
충돌 확률 1조 분의 1 이하3.3조
충돌 확률 1000조 분의 1 이하1030.8억

방식별 비교 (10억 개 기준)

UUID v4 122비트10^-19.0 (1063.4경분의 1)
nanoid 기본 (21자) 126비트10^-20.2 (1.70×10^20분의 1)
nanoid 12자 72비트1.06e-2%
nanoid 10자 60비트35.19%
ULID 80비트10^-6.4 (241.8만분의 1)
단축 URL 6자 (62진) 35.7비트100.00%
단축 URL 8자 (62진) 47.6비트100.00%
MD5 해시 128비트10^-20.8 (6.81×10^20분의 1)
SHA-1 해시 160비트10^-30.5 (2.92×10^30분의 1)
SHA-256 해시 256비트10^-59.4 (2.32×10^59분의 1)
√N 만 되어도 절반은 부딪힙니다. 값이 N 가지여도 √N 개 언저리를 뽑으면 충돌 확률이 50%를 넘습니다. 365일 중 23명이면 생일이 겹칠 확률이 절반을 넘는 그 계산과 같아 생일 문제라고 부릅니다. 뽑는 개수가 4배가 되면 확률은 16배가 됩니다 — k²에 비례하기 때문입니다.
UUID v4의 무작위 비트는 128이 아니라 122입니다. 128비트 중 버전을 나타내는 4비트와 변형을 나타내는 2비트가 고정값으로 박혀 있어 무작위가 아닙니다. 그래도 1조 개를 만들어도 충돌 확률이 10⁻¹⁵ 수준이라 실무에서는 걱정할 일이 없습니다.
짧게 줄이면 금방 위험해집니다. 6자 단축 URL은 62진수라도 35.7비트뿐이라 백만 개만 만들어도 충돌 확률이 1%를 넘습니다. 짧은 ID를 쓰려면 충돌을 확인하고 다시 뽑는 로직이 있어야 하고, 그러려면 데이터베이스에 유니크 제약이 걸려 있어야 합니다.
난수의 품질이 전제입니다. 이 계산은 모든 값이 고르게 나온다는 가정 위에 있습니다. Math.random() 처럼 암호학적으로 안전하지 않은 난수를 쓰면 실제 충돌은 훨씬 잦아질 수 있습니다. ID 생성에는 crypto.getRandomValues() 를 쓰세요.

사용 방법

  1. 1ID 방식을 고르거나 알파벳 크기와 길이를 직접 넣습니다.
  2. 2만들 ID 개수를 넣으면 충돌 확률이 나옵니다.
  3. 3반대로 목표 확률을 넘지 않는 최대 개수도 확인할 수 있습니다.

자주 묻는 질문

실무에서는 겹치지 않습니다. UUID v4의 무작위 비트는 122개라 1조 개를 만들어도 충돌 확률이 10⁻¹⁵ 수준입니다. 다만 수학적으로 0은 아니므로 데이터베이스의 유니크 제약은 걸어 두는 편이 좋습니다.

128비트 중 버전을 나타내는 4비트와 변형을 나타내는 2비트가 고정값이라 무작위가 아니기 때문입니다. 그래서 실제 무작위 공간은 2¹²²입니다.

365일 중 23명만 모여도 생일이 겹칠 확률이 50%를 넘는다는 문제입니다. 값이 N가지여도 √N 언저리만 뽑으면 절반은 부딪힌다는 뜻이라, ID 설계에서 그대로 쓰입니다.

기본값 21자면 126비트로 UUID보다 넓습니다. 12자로 줄이면 72비트인데, 이 정도면 수억 개까지는 안전하지만 수천억 개를 넘어가면 위험해집니다. 만들 개수를 넣어 직접 확인해 보세요.

6자(62진)는 35.7비트뿐이라 백만 개만 만들어도 충돌 확률이 1%를 넘습니다. 짧은 ID를 쓰려면 충돌을 확인하고 다시 뽑는 로직이 있어야 하고, 데이터베이스에 유니크 제약이 걸려 있어야 합니다.

안 됩니다. 이 계산은 모든 값이 고르게 나온다는 가정 위에 있는데, Math.random()은 암호학적으로 안전하지 않아 예측 가능하고 분포도 보장되지 않습니다. ID 생성에는 crypto.getRandomValues()를 쓰세요.

알아두면 좋은 점

  • 모든 값이 고르게 나오는 이상적인 난수를 가정합니다.
  • 확률이 아주 작으면 10의 거듭제곱으로 표시합니다.
  • p ≈ 1 − e^(−k²/2N) 근사식을 씁니다. 개수가 아주 적을 때는 실제보다 조금 크게 나옵니다.

함께 보면 좋은 도구

마지막 검증: 2026년 8월 29일 · 결과는 참고용 추정치입니다.