w

UUID 생성기

UUID란 무엇인가요?

UUID(Universally Unique Identifier, 범용 고유 식별자)는 컴퓨터 시스템에서 정보를 고유하게 식별하는 데 사용되는 128비트 숫자입니다. UUID는 GUID(Globally Unique Identifier, 전역 고유 식별자)라고도 불립니다.

UUID의 특징

  • 고유성: 분산 시스템에서 중복 UUID가 생성될 확률이 극히 낮음
  • 표준화: RFC 4122 표준 준수
  • 크로스 플랫폼: 다양한 운영체제와 프로그래밍 언어에서 사용 가능
  • 비중앙화: 중앙 조정 기관이 불필요

UUID의 응용 시나리오

  1. 데이터베이스 기본키: 분산 데이터베이스의 기본키로 사용
  2. 파일 식별: 파일 시스템 내 파일 식별
  3. 세션 관리: 웹 애플리케이션의 세션 식별
  4. 메시지 큐: 메시지의 고유 식별
  5. 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 버전 선택

  1. 일반 용도: UUID v4 사용
  2. 시간순 정렬 필요: UUID v1 사용
  3. 결정론적 필요: UUID v3 또는 v5 사용
  4. 데이터베이스 기본키: 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일

Was this page helpful?