생성하는 개수와 무작위 비트 수가 주어졌을 때, 무작위로 생성된 두 UUID(범용 고유 식별자)가 충돌할 확률을 생일 근사로 추정한다.
입력
생성
≥ 1
동일한 무작위 원천에서 생성할 식별자의 총 개수.
각 식별자에 포함된 진정한 무작위 비트의 수. 버전 4 UUID는 122개이며, 128비트 가운데 나머지 6비트는 버전과 변형을 나타내는 고정 표식이다.
결과
값을 입력하면 계산 결과가 표시됩니다.
충돌 확률
%
각 식별자가 122개의 무작위 비트를 가질 때, 1,000,000,000개의 식별자 중 최소 둘이 일치할 대략적인 확률.
충돌이 일어날 확률이 대략 절반에 이르는 식별자의 개수.
임계값
충돌 확률이 약 10억분의 1에 이르는 식별자의 개수.
UUID 충돌 확률
UUID(범용 고유 식별자)는 중앙의 관리 기관이 번호를 나눠 주지 않고도 레코드, 파일, 메시지에 이름표를 붙이는 데 쓰이는 128비트 값이다. 그 유용성은 확률적인 약속에 기댄다. 모두가 각자 독립적으로 무작위 UUID를 생성한다면 어떤 두 값이 일치할 확률은 극히 작다는 것이다. 이 계산기는 그 약속을 정량화한다. 생성하는 식별자의 개수와 각 식별자가 담는 무작위 비트의 수가 주어지면 충돌 확률과 충돌이 현실적인 문제가 되는 개수를 추정한다.
고유성이 확률적인 이유
무작위 UUID는 고유성이 보장되지 않는다. 거대한 공간에서 균등하게 뽑히며, 고유성은 논리적 필연이 아니라 통계적으로 거의 확실한 성질이다. 버전 4 UUID는 122개의 무작위 비트를 가지며, 128비트 가운데 나머지 6비트는 버전과 변형을 부호화한다. 따라서 약 개의 값이 가능하다. 이만큼 큰 공간에서는 우연히 값이 겹칠 가능성이 매우 희박하지만, 그 확률이 정확히 0인 것은 아니다.
생일 근사
충돌은 공간의 크기가 시사하는 것보다 훨씬 일찍 일어나기 쉬워지는데, 이는 생일 문제로 알려진 사실이다. 개의 값을 갖는 공간에서 개의 식별자 중 최소 둘이 충돌할 확률은 다음으로 잘 근사된다.
충돌이 일어날 가능성과 일어나지 않을 가능성이 같아지는 50% 지점은 공간의 제곱근 근처에서 도달한다.
122개의 무작위 비트에서는 이 값이 약 개의 식별자, 즉 대략 270경에 해당한다.
계산 예시
공간을 절약하려고 식별자를 64개의 무작위 비트로 줄이고 그것을 10억 개 생성한다고 하자. 충돌 확률은 다음과 같다.
따라서 64비트에서는 10억 개의 식별자가 최소 한 번 충돌할 확률이 약 2.7%이다. 작지만 더 이상 무시할 수 없는 수준이다. 동일한 10억 개를 온전한 122비트 버전 4 UUID로 다루면 충돌 확률은 미만이다.
실무에서의 의미
온전한 버전 4 UUID라면 어떤 현실적인 규모에서도 충돌은 실무상의 우려가 아니다. 10억분의 1의 확률에 이르는 데에도 개 단위의 식별자가 필요하다. 실제 위험은 다른 곳에 있다. 예측 가능하거나 반복되는 출력을 만들어 내는 취약하거나 잘못 초기화된 난수 생성기, 또는 식별자를 더 적은 비트로 잘라 내어 생일 한계를 크게 앞당기는 경우이다. 식별자를 짧게 줄였다면 줄어든 비트 수로 다시 계산해야 한다. 동일한 충돌 수학을 해시 함수에 적용하는 경우는 해시 충돌 확률 계산를 참고하면 된다.
이 수치들은 개수가 공간의 크기보다 훨씬 작을 때 유효한 근사이며, 이는 UUID의 모든 현실적인 용도에서 성립한다.
자주 묻는 질문 (FAQ)
UUID는 고유성이 보장되는가?
아니다. 무작위 UUID는 고유성이 보장되지 않으며, 다만 충돌이 압도적으로 일어나기 어려울 만큼 거대한 공간에서 뽑힐 뿐이다. 버전 4 UUID는 122개의 무작위 비트를 가지므로 약 5.3 × 10³⁶개의 값이 가능하다.
이만큼 많은 경우의 수에서 같은 값을 두 번 생성할 확률은 현실적인 식별자 개수에서는 무시할 수 있을 만큼 작지만, 정확히 0은 아니다. 절대적인 고유성이 필요한 시스템은 여전히 데이터베이스 제약 조건으로 이를 강제한다.
UUID에는 무작위 비트가 몇 개 있는가?
UUID는 길이가 128비트이지만 모두가 무작위인 것은 아니다. 버전 4(무작위) UUID에서는 6비트가 버전과 변형을 부호화하는 데 예약되어 있어 무작위 비트는 122개가 남는다.
버전 1 UUID는 타임스탬프와 노드 식별자에 더 작은 무작위 요소를 섞으며, 버전 7과 같은 최신 방식은 타임스탬프와 무작위 비트를 함께 담는다. 충돌 계산은 오직 진정한 무작위 비트의 개수에만 좌우되므로, 이 계산기는 그 수를 직접 입력받는다.
생일 한계란 무엇인가?
생일 문제는 직관이 시사하는 것보다 훨씬 일찍 충돌이 일어날 가능성이 높아짐을 보여 준다. 2^b개의 값을 갖는 공간에서 충돌 확률은 약 √(2^b)번 생성한 뒤에 약 50%에 이른다. 즉 공간 전체가 아니라 그 제곱근이다. 122개의 무작위 비트에서는 이 값이 약 2.7 × 10¹⁸개의 식별자이므로, 10억 개의 UUID를 생성하더라도 충돌 확률은 천문학적으로 작은 상태로 남는다.
실무에서 UUID 충돌을 걱정해야 하는가?
버전 4 UUID라면 어떤 현실적인 규모에서도 답은 거의 언제나 아니오이다. 의미 있는 확률에 이르려면 100경 단위로 생성해야 한다.
실제 위험은 다른 곳에 있다. 예측 가능하거나 반복되는 값을 만들어 내는 취약하거나 잘못 초기화된 난수 생성기, 또는 공간을 절약하려고 UUID를 더 적은 비트로 잘라 내는 경우이다. 식별자를 짧게 줄이면 충돌이 훨씬 일찍 일어날 수 있으므로, 줄어든 비트 수로 확률을 다시 계산해야 한다.