Search
Duplicate

UUID(Universally Unique Identifier)

UUID는 ‘Universally unique identifier’의 약자로 128-bit의 고유 식별자에요. 다른 고유 ID 생성 방법과 다르게 UUID는 중앙시스템에 등록하고 발급하는 과정이 없어서 상대적으로 더 빠르고 간단하게 만들 수 있다는 장점이 있어요.
하지만 완전히 고유하지 않을 확률이 있는데요. link iconIETF DatatrackerRFC 4122: A Universally Unique IDentifier (UUID) URN Namespace 문서에 정의된 UUID 버전 4 표준 규약을 따르면 1조개의 UUID중에 중복이 일어날 확률은 10억 분의 1입니다. UUID의 또다른 장점은 작은 크기 입니다. 다른 고유 식별자에 비해 정렬, 차수, 해싱등 다양한 아라고리즘에 사용하기 쉽고 데이터베이스에 보관하기도 용이해요.
UUID의 구조를 더 자세히 살펴볼게요. 일단 128-bit의 숫자 문자열이고 총 길이는 36자리입니다. 32개의 16진수 숫자가 4개의 하이픈으로 나누어진 8-4-4-4-12 형태에요. 예를 들어 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d와 같은 형태이죠.
하이픈 사이에 있는 16진수 숫자들은 하나의 필드인데요. 각 필드는 정수로 취급되며 가장 중요한 숫자가 앞에 나옵니다. 예를 들어 아래 이미지에 볼드된 세 번째 필드의 첫 숫자는 4인데요, UUID의 버전입니다. 어떤 UUID를 봐도 세 번째 필드의 첫 번째 숫자는 버전 정보를 나타내요.
UUID 필드
각 필드 정보는 아래 표에서 확인할 수 있어요.
필드
사이즈
설명
time-low
4hexOctet / 32bit
타임스탬프의 low field
time-mid
2hexOctet / 16bit
타임스탬프의 mid field
time-high-and-version
2hexOctet / 16bit
타임스탬프의 high field & UUID 버전
clock-seq-hi-and-reserved
hexOctet / 8bit
클락 시퀀스의 high field & variant
clock-seq-low
hexOctet / 8bit
클락 시퀀스의 low field
node
6hexOctet / 48bit
node 식별자
UUID 버전
UUID는 총 5개의 버전이 있어요. 버전 1, 2는 보통 타임스탬프(Timestamp) UUID로 부르는데요. 버전 1, 2의 UUID는 만들어진 시점과 기기 정보를 알 수 있어요. 버전 3과 5는 네임스페이스(Namespace) 기반으로 만드는 UUID입니다. 네임스페이스를 해싱 알고리즘으로 암호화해서 UUID를 생성해요. 버전 3, 5의 UUID는 다른 정보와 연결된 값을 만들고 싶을 때 사용하면 좋아요.
가장 흔히 사용하는 UUID는 버전 4인데요. 다른 버전과 달리 외부 정보에 의존하지 않고 완전히 랜덤한 값으로 생성돼요. 시간, 기기 정보, 네임스페이스 등 정보가 없기 때문에 어디서 어떻게 생성됐는지 알 수 없어요. 보안 측면에서 뛰어나고 생성도 빠르기 때문에 대중적으로 사용되고 있어요.
상황에 맞는 UUID 버전을 사용하세요. 완전히 고유하고 랜덤한 값이 필요하다면 버전 4를 사용하세요. 고유하면서 완전히 랜덤한 값보다 특정 정보가 필요하면 다른 버전을 검토해보세요.

Windows: CoCreateGuid 사용

Windows에서는 CoCreateGuid 함수를 사용하여 GUID(UUID 윈도우 버전)를 생성할 수 있습니다.
cpp 코드 복사 #include <iostream> #include <objbase.h> typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8]; } GUID; int main() { GUID guid; CoCreateGuid(&guid); // GUID 출력 printf("%08lX-%04X-%04X-%04X-%012llX\n", guid.Data1, guid.Data2, guid.Data3, (guid.Data4[0] << 8) | guid.Data4[1], (unsigned long long)(guid.Data4[2] << 40) | (guid.Data4[3] << 32) | (guid.Data4[4] << 24) | (guid.Data4[5] << 16) | (guid.Data4[6] << 8) | guid.Data4[7]); return 0; }
C++
복사
이 방법들 중 하나를 선택해 사용하면 C++에서 UUID를 생성할 수 있습니다. Boost는 다양한 플랫폼에서 동작하며 표준화된 인터페이스를 제공하는 점에서 유용하며, OS API는 시스템에 종속적이지만 별도의 라이브러리 설치 없이 사용할 수 있습니다.