UUID 생성기
UUID란 무엇인가요?
UUID(Universally Unique Identifier, 범용 고유 식별자)는 컴퓨터 시스템에서 정보를 고유하게 식별하는 데 사용되는 128비트 숫자입니다. UUID는 GUID(Globally Unique Identifier, 전역 고유 식별자)라고도 불립니다.
UUID의 특징
- 고유성: 분산 시스템에서 중복 UUID가 생성될 확률이 극히 낮음
- 표준화: RFC 4122 표준 준수
- 크로스 플랫폼: 다양한 운영체제와 프로그래밍 언어에서 사용 가능
- 비중앙화: 중앙 조정 기관이 불필요
UUID의 응용 시나리오
- 데이터베이스 기본키: 분산 데이터베이스의 기본키로 사용
- 파일 식별: 파일 시스템 내 파일 식별
- 세션 관리: 웹 애플리케이션의 세션 식별
- 메시지 큐: 메시지의 고유 식별
- API 인터페이스: API 요청과 응답의 식별
UUID 버전 상세 설명
UUID v1(시간 및 노드 기반)
형식: xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx
특징:
- 현재 시간과 노드 ID(보통 MAC 주소) 기반
- 타임스탬프 정보 포함, 시간순 정렬 가능
- MAC 주소 정보가 노출될 가능성
생성 알고리즘:
// 의사 코드 예시
function generateUUIDv1() {
const timestamp = Date.now();
const nodeId = getMACAddress();
const clockSeq = random16Bit();
return formatUUID(timestamp, clockSeq, nodeId);
}
UUID v3(네임스페이스 및 MD5 기반)
형식: xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx
특징:
- 네임스페이스 UUID와 이름의 MD5 해시 기반
- 같은 네임스페이스와 이름은 항상 같은 UUID 생성
- 결정론적 UUID가 필요한 시나리오에 적용
생성 알고리즘:
function generateUUIDv3(namespace, name) {
const namespaceBytes = parseUUID(namespace);
const nameBytes = Buffer.from(name, 'utf8');
const hash = crypto
.createHash('md5')
.update(Buffer.concat([namespaceBytes, nameBytes]))
.digest();
return formatUUIDv3(hash);
}
UUID v4(랜덤 생성)
형식: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
특징:
- 완전히 랜덤 생성
- 가장 일반적으로 사용되는 UUID 버전
- 의미 있는 정보를 포함하지 않음
생성 알고리즘:
function generateUUIDv4() {
const bytes = crypto.randomBytes(16);
bytes[6] = (bytes[6] & 0x0f) | 0x40; // 버전 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // 변형
return formatUUID(bytes);
}
UUID v5(네임스페이스 및 SHA-1 기반)
형식: xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx
특징:
- 네임스페이스 UUID와 이름의 SHA-1 해시 기반
- v3보다 안전(MD5 대신 SHA-1 사용)
- 결정론적 UUID가 필요한 시나리오에 적용
UUID NIL(빈 UUID)
형식: 00000000-0000-0000-0000-000000000000
특징:
- 모든 비트가 0
- "UUID 없음" 또는 "알 수 없는 UUID"를 나타내는 데 사용
- 데이터베이스 설계에서 기본값으로 사용
사전 정의된 네임스페이스
표준 네임스페이스 UUID
- DNS 네임스페이스:
6ba7b810-9dad-11d1-80b4-00c04fd430c8
- URL 네임스페이스:
6ba7b811-9dad-11d1-80b4-00c04fd430c8
- OID 네임스페이스:
6ba7b812-9dad-11d1-80b4-00c04fd430c8
- X.500 DN 네임스페이스:
6ba7b814-9dad-11d1-80b4-00c04fd430c8
사용 예시
// DNS 네임스페이스를 사용하여 UUID v3 생성
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// 결과: 5df41881-3aed-3515-88a7-2f4a814cf09e
API 인터페이스
단일 UUID 생성
// UUID v4 생성
const uuid = generateUUID('v4');
// UUID v1 생성
const uuid = generateUUID('v1');
// UUID v3 생성
const uuid = generateUUID('v3', {
namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
name: 'example.com',
});
배치 UUID 생성
// 배치 UUID 생성
const uuids = generateMultipleUUIDs('v4', 10);
// 다양한 버전의 UUID 생성
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);
UUID 검증
// UUID 형식 검증
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');
// UUID 버전 가져오기
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');
성능 고려사항
생성 속도
- v4(랜덤): 가장 빠름, 약 100,000 UUID/초
- v1(시간): 중간, 약 50,000 UUID/초
- v3/v5(해시): 느림, 약 10,000 UUID/초
메모리 사용량
- 각 UUID는 16바이트 차지
- 배치 생성 시 메모리 사용량 주의
동시성 안전성
- v4는 암호학적으로 안전한 난수 생성기 사용
- v1은 클록 시퀀스의 고유성 보장 필요
모범 사례
UUID 버전 선택
- 일반 용도: UUID v4 사용
- 시간순 정렬 필요: UUID v1 사용
- 결정론적 필요: UUID v3 또는 v5 사용
- 데이터베이스 기본키: UUID v4 권장
저장 최적화
-- PostgreSQL에서 UUID 저장
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255)
);
-- 인덱스 생성
CREATE INDEX idx_users_id ON users(id);
성능 최적화
// 객체 풀을 사용하여 메모리 할당 감소
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());
// 배치 생성 시 Web Workers 사용
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });
자주 묻는 질문
Q: UUID와 GUID의 차이점은?
A: UUID와 GUID는 본질적으로 동일하며, 이름만 다릅니다. UUID는 RFC 표준 용어이고, GUID는 Microsoft의 용어입니다.
Q: UUID는 중복될 수 있나요?
A: 이론적으로는 가능하지만 확률이 극히 낮습니다. v4 UUID의 중복 확률은 약 2.71 × 10^-36입니다.
Q: UUID 버전은 어떻게 선택해야 하나요?
A: 요구사항에 따라 선택:
- 랜덤성이 필요: v4
- 시간 정보가 필요: v1
- 결정론적이 필요: v3 또는 v5
Q: UUID는 데이터베이스 성능에 영향을 주나요?
A: 영향을 줄 수 있습니다. UUID가 정수 기본키보다 크기 때문입니다. 권장사항:
- B-tree 인덱스 사용
- UUID v1(시간순 정렬) 사용 고려
- 적절한 경우 정수 기본키 사용
관련 도구
기술 사양
RFC 표준
- RFC 4122: UUID 사양
- RFC 4122 Section 4.1.3: UUID 버전 정의
프로그래밍 언어 지원
- JavaScript:
crypto.randomUUID()
(Node.js 14.17+) - Python:
uuid
모듈 - Java:
java.util.UUID
- C#:
System.Guid
마지막 업데이트: 2024년 1월 20일