GUID란? — GUID의 구조, 버전, 유일성 쉽게 파헤치기
2026-05-24
태그: Windows · GUID · 가이드 · QuickGUID
Windows에서 개발을 해 본 적이 있다면, 분명 한 번쯤은 봤을 겁니다. 마치 난수 같은 16진수 문자열:
6B29FC40-CA47-1067-B31D-00DD010662DA레지스트리 안에, 프로젝트 설정 파일에, 로그 출력에, 혹은 어느 에러 메시지 중간에 등장할 수 있습니다. 이름이 GUID라는 건 알고 있고, "아마 고유하겠지"라고도 생각합니다. 하지만 이 문자열이 진짜 뭔지, 왜 이런 형태인지, 어떻게 중복되지 않는 건지——이런 질문을 진지하게 생각해 본 적은 아마 없을 겁니다.
오늘은 이 부분을 정리해 보겠습니다.
UUID와 GUID: 같은 것의 다른 이름
먼저 많은 분이 모르는 사실부터: GUID와 UUID는 같은 것입니다.
- UUID(Universally Unique Identifier, 범용 고유 식별자)가 공식 명칭이며, RFC 4122에 정의되어 있습니다.
- GUID(Globally Unique Identifier, 전역 고유 식별자)는 Microsoft가 붙인 별명입니다.
그게 전부입니다. UUID가 표준명이고, GUID는 Microsoft가 COM, Windows API, .NET 등의 기술 스택에서 사용하는 이름입니다. Windows에서 보는 GUID나 Linux에서 보는 UUID나 본질적으로 같은 것입니다.
이 글에서는 주로 GUID라는 이름을 사용하겠습니다——Windows 개발을 다루고 있으니까요.
GUID의 구조: 무작위처럼 보이지만, 규칙이 있다
표준 GUID는 이런 형태입니다:
6B29FC40-CA47-1067-B31D-00DD010662DA8-4-4-4-12, 총 32개의 16진수 문자(128비트)가 하이픈으로 5개 구간으로 나뉘어 있습니다. 무작위로 보이지만, 사실 구조가 있습니다:
6B29FC40-CA47-1067-B31D-00DD010662DA
↑ ↑
버전 변형핵심은 세 번째 구간의 첫 글자와 네 번째 구간의 첫 글자입니다:
- 버전(Version): 세 번째 구간의 첫 16진수 자리가 이 GUID를 어떤 알고리즘으로 생성했는지 나타냅니다.
1은 v1,4는 v4,7은 v7을 의미합니다. - 변형(Variant): 네 번째 구간의 첫 16진수 자리가 어떤 표준 사양을 따르는지 나타냅니다.
8,9,A,B로 시작하면 RFC 4122를 따르는 것——평소에 보는 GUID의 대부분이 이 변형입니다.
다음에 GUID를 볼 때, 세 번째 구간의 첫 글자만 슬쩍 확인하면 v1인지, v4인지, v7인지 알 수 있습니다. 겉모습만 보는 것보다 훨씬 유용합니다.
GUID에는 어떤 버전이 있을까?
UUID 규격에는 여러 버전이 정의되어 있지만, 실제로 사용되는 것은 주로 세 가지입니다:
v1: 시간 + MAC 주소 기반
v1 GUID는 현재 타임스탬프(100나노초 정밀도)와 네트워크 인터페이스의 MAC 주소를 조합하여 생성됩니다.
장점: 자연스럽게 시간순으로 정렬됩니다. 단점: 생성 시간이 노출되고, MAC 주소는 하드웨어 정보입니다——이는 프라이버시와 보안 측면에서 큰 문제입니다. 공격자는 v1 GUID에서 네트워크 주소와 생성 시간을 역추적할 수 있습니다.
그래서 지금은 v1을 사용하는 사람이 거의 없지만, 오래된 시스템에서는 여전히 그 흔적을 찾을 수 있습니다.
v4: 완전 무작위
v4는 현재 가장 흔한 버전입니다. 버전 번호와 변형 비트가 고정되어 있는 것을 제외하고, 나머지 122비트는 모두 난수로 채워집니다.
타임스탬프도 없고, 하드웨어 정보도 없이, 오직 무작위성만으로 고유성을 보장합니다. 단순하지만 매우 효과적입니다.
프로젝트에서 new Guid(), uuid.uuid4(), crypto.randomUUID()로 생성하는 것은 거의 다 v4입니다.
v7: 시간 정렬 가능한 신예
v7은 2024년에야正式으로 표준에 편입된 새로운 버전입니다. 앞의 48비트에 밀리초 단위의 타임스탬프를 저장하고, 나머지 비트는 난수로 채웁니다.
왜 v7을 만들었을까요? v4는 훌륭하지만, 완전히 무작위라서 시간순으로 정렬할 수 없습니다. 이것은 데이터베이스에 문제가 됩니다:
- 데이터베이스에서 GUID를 기본 키로 사용할 때, v4는 완전히 무작위이므로 삽입 순서와 인덱스 순서가 일치하지 않아 B+ 트리가 자주 분할되고 쓰기 성능이 저하됩니다.
- v7은 앞부분이 타임스탬프이므로 자연스럽게 시간순으로 증가하고, 삽입 순서와 인덱스 순서가 거의 일치하여 쓰기 성능이 훨씬 좋습니다.
프로젝트에서 GUID를 데이터베이스 기본 키로 사용한다면, v7이 v4보다 더 나은 선택입니다.
"GUID는 중복되지 않는다"——하지만 인터넷에 떠도는 그 말, 계산이 틀렸습니다
GUID의 고유성 이야기가 나올 때마다, "만약 중복되면 어떡하나요?"라는 질문이 꼭 등장합니다.
인터넷에는 이런 주장이 돌고 있습니다: "v4 GUID의 충돌 확률은 무시할 수 있을 정도로 작아서, 초당 10억 개를 10억 년간 생성해도 중복되지 않는다." 마음이 놓이는 이야기죠?
하지만 이 주장은 수학적으로 틀렸습니다.
뭐가 틀렸나요? 생일 역설
이건 생일 역설(Birthday Paradox)이라는 고전적인 직관의 함정에 빠진 것입니다.
아마 들어보셨을 겁니다: 한 방에 몇 명이 모여야 "어떤 두 사람의 생일이 같을" 확률이 50%를 넘을까요? 직관적으로는 1년이 365일이니 180명쯤은 되어야 할 것 같습니다.
실제로는 23명이면 충분합니다.
이유는, "어떤 특정인이 특정 날짜와 일치하는지"를 보는 게 아니라, "모든 사람의 쌍 중에서" 일치하는지를 보기 때문입니다. 사람 수가 늘어나면 쌍의 조합 수가 급격히 증가합니다.
GUID도 마찬가지입니다. "어떤 GUID가 우연히 다른 GUID와 같아지는지"만 보는 게 아니라, "이미 생성된 모든 GUID 중에서 임의의 두 개가 충돌하는지"를 봐야 합니다. 조합 수는 총량에 대해 제곱으로 증가하며, 직관이 말해주는 것보다 훨씬 빠릅니다.
실제 충돌 타임라인
초당 10억 개의 속도로 쉬지 않고 생성한다고 가정하고, 생일 역설 공식으로 다시 계산해 보면:
- 10년: 충돌 확률 약 1%
- 33년: 충돌 확률 약 10%
- 86년: 충돌 확률 약 50%
10억 년이라면? 그때는 충돌 횟수를 셀 수도 없습니다.
그래도 안심하고 쓸 수 있을까요?
물론입니다. 위의 전제는 "초당 10억 개, 쉬지 않고"입니다——현실에서 이 규모를 달성하는 애플리케이션은 없습니다.
시스템의 전체 수명 주기 동안 총 100조 개의 GUID를 생성했다고 해도 (이미 극도로 과장된 천문학적 숫자입니다), 충돌 확률은 10억 분의 1에 불과합니다.
안심하고 사용하세요.
일상 개발에서 겪는 GUID의 번거로움
원리를 이해했으니, 현실로 돌아가 봅시다. 개발자가 일상적으로 GUID를 다룰 때 진짜 골칫거리는 "중복되느냐"가 아니라 다음과 같은 것들입니다:
생성이 불편하다
Windows에 내장된 guidgen.exe는 한 번에 하나만 생성할 수 있습니다. 터미널에서는? PowerShell로 [guid]::NewGuid()는 가능합니다. 하지만 테스트 데이터용으로 한 번에 50개가 필요하다면? 스크립트를 작성해야 합니다.
포맷이 다종다양하다
같은 GUID도 언어와 상황에 따라 전혀 다르게 보입니다:
6B29FC40-CA47-1067-B31D-00DD010662DA // 표준 포맷
6B29FC40CA471067B31D00DD010662DA // 하이픈 없음
{6B29FC40-CA47-1067-B31D-00DD010662DA} // 중괄호 (C#/COM)
urn:uuid:6B29FC40-CA47-1067-B31D-00DD010662DA // URN
aKXwnELGRYeysdADQClibto= // Base64로그에서 GUID를 복사해서 C 코드의 DEFINE_GUID 매크로 형식으로 변환해야 한다면? 수동으로 수정해야 합니다.
텍스트에서 추출하기 번거롭다
로그 파일에 수십 개의 GUID가 흩어져 있는데, 모두 찾고 싶다면? 육안으로 스캔할까요, 정규식을 작성할까요?
[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}작동은 하지만, 매번 찾아봐야 제대로 쓸 수 있습니다.
QuickGUID로 해결하세요
이런 불편함은 하나의 도구로 모두 해결할 수 있습니다. QuickGUID는 Windows 네이티브 GUID 도구 상자입니다:
- 일괄 생성: v4 또는 v7을 한 번에 최대 1,000개까지 생성
- 10가지 이상의 포맷 실시간 변환: 표준, 하이픈 없음, 중괄호, Base64, C 바이트 배열,
DEFINE_GUID매크로…… 모두 실시간 미리보기 - 스마트 추출: 로그나 소스 코드를 붙여넣기만 하면 모든 GUID를 자동 인식하여 일괄 변환
- 실시간 데코레이터: 따옴표, 접미사, 대소문자를 전역적으로 전환, 복사해서 바로 사용 가능
완전 무료, 100% 오프라인.
마무리
GUID는 소프트웨어 개발에서 가장 눈에 띄지 않지만 가장 신뢰할 수 있는 인프라 중 하나입니다. 128비트로, 중앙 조정도, 네트워크 연결도 없이 전 세계적으로 고유성을 보장할 수 있습니다. 이 설계는 탄생한 지 30년이 넘었지만, 여전히 분산 시스템에서 식별자의 모범 사례 중 하나입니다.
이 글이 GUID 뒤에 숨겨진 "왜"를 이해하는 데 도움이 되었기를 바랍니다.