정말 UUID 버전 4의 중복 가능성은 없을까?

TABLE OF CONTENTS

UUID 버전 4 (UUID4)를 통해 고유 키 값을 생성하던 도중 문득 UUID는 절대로 겹칠 가능성이 없을까에 대한 의심이 생겼다. 정말 안전할까?

UUID 일러스트레이션

UUID란?

UUID는 "Universally Unique Identifier"의 약자로, 전 세계적으로 고유한 식별자를 의미한다. 이는 128비트의 길이를 가지며, 16진수를 사용하여 표현된다. UUID는 데이터베이스, 시스템 내에서 객체나 정보를 구별하기 위해 사용되며, 중복의 가능성을 거의 제로에 가깝게 하여 어떤 환경에서든 고유성을 보장한다.

UUID는 다양한 버전이 있으며, 각 버전은 생성 방식에 따라 다르다. 예를 들어, 버전 1은 시간 기반으로 생성되며, 버전 4는 완전히 무작위로 생성됩니다. 이러한 식별자는 소프트웨어 개발, 네트워킹, 파일 시스템 관리 등 다양한 분야에서 유용하게 사용된다.

UUID 버전 4 (UUID4)

UUID 버전 4 (UUID4)는 완전히 무작위로 생성되는 UUID이다. 이 버전은 128비트의 길이를 가지며, 이 중 122비트는 무작위로 생성되고, 나머지 비트는 버전과 변형을 식별하는 데 사용된다. UUID4는 고유성을 제공하는 데 중점을 두며, 그 고유성은 난수 생성 알고리즘의 품질에 크게 의존한다.

UUID4의 구조

  1. 32개의 16진수로 구성된 8-4-4-4-12의 형식을 가진다.
    • 예: 123e4567-e89b-12d3-a456-426614174000
  2. 버전 번호는 항상 4로 설정되며, 이는 UUID의 특정 부분에서 확인할 수 있다.
  3. 변형 필드도 특정 값을 가지며, 이는 UUID가 RFC 4122 규격을 따른다는 것을 나타낸다.

UUID4의 특징

  1. 고유성: UUID4는 매우 높은 수준의 고유성을 제공한다. 이론적으로 충돌 확률이 있지만, 실제로는 거의 발생하지 않는다고 할 수 있다.
  2. 무작위성: UUID4는 완전히 무작위로 생성되므로 생성된 값에서 어떠한 정보도 추론할 수 없다. 이는 보안 측면에서 유리할 수 있다.
  3. 이식성과 범용성: UUID4는 플랫폼 독립적이며, 어떤 시스템이나 애플리케이션에서도 고유한 식별자로 사용될 수 있다.

UUID4는 그 고유성 때문에 데이터베이스의 기본 키, 세션 식별자, 트랜잭션 식별자 등 다양한 목적으로 널리 사용된다. 그러나 무작위성이 필요하지 않은 경우나 생성된 UUID에서 특정 정보를 추출해야 하는 상황에서는 다른 버전의 UUID를 고려할 수 있다.

UUID4 조합의 총 수

이론상으로는 UUID가 중복될 가능성이 있지만, 실제로는 그 가능성이 극히 낮다. UUID4는 128비트 중 122비트를 무작위로 할당한다. 이에 따라, 가능한 고유한 UUID 조합의 총 수 $N$은 다음과 같이 계산된다:

$$ N = 2^{122} $$

이는 대략 $5.3 \times 10^{36}$가지의 고유한 조합을 의미한다.

UUID4의 겹칠 가능성

이러한 방대한 수의 가능한 조합 덕분에, 무작위로 생성된 UUID가 충돌할 확률은 실질적으로 무시할 수 있을 정도로 낮다. 그러나 이론적으로는 가능성이 0이 아니기 때문에, 완전히 배제할 수는 없다. 그럼에도 불구하고, 현실 세계에서 UUID의 충돌을 경험할 가능성은 아주 낮아서 대부분의 응용 프로그램에서는 이를 고유한 식별자로 안전하게 사용한다.

만약 매우 낮은 확률이지만 UUID의 중복을 완전히 배제하고 싶다면, 파일 업로드 시 UUID를 생성한 후 해당 UUID가 이미 사용 중인지 데이터베이스나 저장소에서 확인하는 추가 검증 절차를 도입할 수 있다. 만약 중복이 발견되면 새로운 UUID를 생성하고 검증 절차를 반복한다. 하지만 이러한 검증 절차는 대규모 시스템에서도 거의 필요하지 않을 정도로 UUID의 충돌 확률이 낮다.

비유를 통해 알아보는 겹칠 확률

지구상의 모래알

지구상의 모든 해변과 사막에 있는 모래알의 총 개수는 대략 $7.5 \times 10^{18}$ 개로 추정된다. UUID가 가진 고유한 조합의 수는 이보다 약 $10^{18}$배 더 많다. 즉, 지구의 모든 모래알을 수천 번, 수백만 번 더 모아놓은 것과 비슷한 수준의 조합을 UUID는 제공한다.

별의 개수

우리 은하에 있는 별의 개수는 대략 $1\times10^{11}$개 정도로 추정된다. 전체 우주에 있는 별의 개수는 대략 $1\times10^{24}$개 정도로 추정된다. UUID의 고유한 조합 수는 이보다도 훨씬 많아, 우주에 있는 별의 개수보다도 많은 고유한 식별자를 생성할 수 있다.

우주선

만약 우주선을 타고 우리 은하의 모든 별을 방문하여 각 별마다 고유한 UUID를 할당한다고 가정해본다. 그리고 나서 다른 은하로 이동하여 같은 작업을 반복한다. 수십억 개의 은하에 있는 모든 별에 고유한 UUID를 할당해도, 모든 UUID를 사용하지 않을 것이다.

결론

어느 정도의 UUID가 생성되어야 최소 한 쌍이 중복될 확률이 상당히 증가하는지 추정할 수 있니다. 중복이 발생할 확률이 50%에 도달하는 데 필요한 UUID의 수 $n$은 대략적으로 다음과 같이 계산할 수 있다:

$$ n \approx 1.2 \times \sqrt{N} $$

여기서 $N$은 가능한 고유한 조합의 총 수이다. 따라서, $N = 2^{122}$를 대입하면,

$$ n \approx 1.2 \times \sqrt{2^{122}} = 1.2 \times 2^{61} $$

이는 대략 $n \approx 1.2 \times 10^{18}$ 정도의 UUID가 생성되어야 최소 한 쌍의 중복이 50% 확률로 발생함을 의미한다.

이 계산식들은 UUID의 중복 확률이 실제로 얼마나 낮은지를 수치적으로 보여준다. 따라서, UUID를 데이터베이스의 고유 식별자나 시스템 내 고유 리소스 식별자로 사용하는 경우, 실질적인 용도에서는 고유성을 거의 완벽하게 보장받을 수 있음을 의미한다. 실제 응용 프로그램에서 UUID가 중복될 확률은 사실상 거의 고려할 필요가 없을 정도로 낮다. 따라서 실제 개발에서는 UUID를 안심하고 고유한 식별자로 사용할 수 있다. 앞으로 걱정하지 말자.

Comments

지나가던 궁금증있던 개발자1

저도 너무 궁금했던 내용인데 지구상 모래알, 별 개수등으로 비유해주신게 너무 잘 와닫네요..! 앞으로는 중복에 대한 믿음을 지지않고 활발하게 사용해야겠습니다! 감사합니다!!

2024년 5월 10일 8시 35분
Leave Your Comment