범용 고유 식별자

Gaon12 (토론 / 기여)님의 2025년 5월 23일 (금) 14:27 판

개요

UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. 2005년의 RFC 4122가 2024년 5월 발표된 RFC 9562로 대체되며, 최신 규격에서 버전 6 · 7 · 8이 정식 표준에 포함되었다. UUID는 32자리 16진수 숫자를 8-4-4-4-12 형식으로 하이픈으로 구분하여 표현한다. 예) 123e4567-e89b-12d3-a456-426614174000. 버전 7은 밀리초 단위 Unix 타임스탬프를 상위 48비트에 포함해 시간 순 정렬성을 대폭 향상시켰다.

장단점

장점

  • 전 세계적 고유성: 분산 환경에서도 중복 없이 고유한 식별자를 생성할 수 있다.
  • 충돌 가능성 낮음: 2122 (≈5.3 × 1036)개의 조합으로 충돌 확률이 극히 낮다.
  • 독립성: 중앙 서버와 통신하지 않아도 식별자를 만들 수 있다.
  • 범용성: 대부분의 언어·플랫폼에서 기본 또는 외부 라이브러리로 지원한다.
  • 정렬성 향상: 버전 6·7은 시간 정보를 앞부분에 배치해 인덱스 지역성 문제를 완화한다.

단점

  • 크기: 16바이트이므로 대규모 DB 인덱스에는 부담이 될 수 있다.
  • 가독성: 사람이 읽고 기억하기엔 복잡하다.
  • 정렬: 난수 기반인 버전 4는 생성 순서가 무작위라 B-tree 인덱스 파편화가 심하다.
  • 보안: 버전 1은 MAC 주소·시간 정보가 노출될 수 있다.

특징

  • 고유성: 전 세계적으로 유일하다.
  • 확장성: 네트워크 상태와 무관하게 생성 가능.
  • 독립적 생성: 중앙 서버 없이 분산 환경에서 사용 가능.
  • 표준화: RFC 9562로 상호 운용성 보장.
  • 다양한 버전: 1 ~ 8 버전이 존재하며 용도별로 선택할 수 있다.
  • 풍부한 라이브러리: Python·Go·JavaScript 등에서 모듈 또는 패키지 형태로 제공된다.

UUID의 버전

  • 버전 1 (타임스탬프 + MAC): 시간·MAC 기반, 개인 정보 노출 우려.
  • 버전 2 (DCE 보안): POSIX UID/GID 포함, 실무 사용 거의 없음.
  • 버전 3 (이름 기반 + MD5): 동일 입력에 동일 UUID 보장.
  • 버전 4 (난수 기반): 가장 널리 쓰이며 충돌 확률 매우 낮음.
  • 버전 5 (이름 기반 + SHA-1): v3과 같으나 해시 알고리즘만 SHA-1.
  • 버전 6 (시간순 정렬 강화): v1의 한계를 보완해 상위비트에 big-endian 시간값 배치.
  • 버전 7 (Unix 에포크 밀리초): 48비트 타임스탬프 + 74비트 난수, 인덱스 친화적.
  • 버전 8 (사용자 정의): 응용 프로그램이 의미를 정의하는 커스텀 UUID.

주요 구현 및 채택 현황

  • PostgreSQLuuid_generate_v7() 함수를 제공하는 확장 pg_uuidv7.
  • Python — 표준 라이브러리는 v1·3·4·5만 지원하며, v7 추가 제안이 진행 중이다.
  • Gogithub.com/google/uuidflexstack/uuid 등이 v7을 지원한다.
  • Java — 표준 java.util.UUID는 v7을 아직 포함하지 않아 커뮤니티 논의가 활발하다.
  • DuckDB — 1.3.0에서 v7 지원을 추가했으나 타임스탬프 호환성 이슈가 보고되었다.
  • 기타 언어들도 외부 라이브러리 형태로 빠르게 v7을 채택 중이다.

충돌 확률

버전 4·6·7·8 모두 122비트 이상의 무작위 엔트로피를 갖는다. 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않는다.

결론

UUID는 여전히 분산 시스템에서 사실상 표준 식별자이며, RFC 9562 채택으로 버전 6·7·8이 공식화되어 정렬성과 활용성이 크게 개선되었다. 각 상황에 맞는 버전을 선택해 사용하면, 충돌 위험을 최소화하면서도 성능·보안·정렬성 요구 사항을 충족할 수 있다.