본문으로 바로가기

UUID 버전 7 생성기

UUIDv7 • 시간 순 정렬 표준 (RFC 9562)
00000000-0000-0000-0000-000000000000
감싸기:

UUID 대량 배치 생성

최대 5,000개
형식 및 구조 설정

준비 완료

No batch active
최신 표준 규격 (2024)RFC 9562 섹션 5.7

UUID 버전 7 기술 사양 (RFC 9562)

UUIDv7은 48비트의 밀리초 단위 Unix Epoch 타임스탬프와 74비트의 암호학적 난수 엔트로피 및 시퀀스 데이터를 결합한 차세대 식별자입니다. 기존 UUIDv4의 무작위 키로 인해 발생하던 데이터베이스 B-Tree 인덱스 단편화와 페이지 분할 문제를 근본적으로 해결하기 위해 RFC 9562(2024년 제정)에서 표준화되었습니다.

비트필드 레이아웃 및 바이너리 구조

RFC 표준에 따른 128비트 바이트 세부 구조입니다.

필드 이름비트 범위용도 및 설명
unix_ts_ms48비트 (0-47)밀리초 단위 부호 없는 빅엔디안 Unix Epoch 타임스탬프.
ver4비트 (48-51)고정 바이너리 값 0111 (버전 7 식별).
rand_a12비트 (52-63)무작위 엔트로피 또는 밀리초 미만 시퀀스 카운터.
var2비트 (64-65)고정 바이너리 값 10 (RFC 4122/9562 표준 변형).
rand_b62비트 (66-127)암호학적으로 안전한 의사 난수 엔트로피 비트.

장점 및 특징

  • 자연스러운 시계열 정렬 지원으로 클러스터형 B-Tree 인덱스(PostgreSQL, MySQL, SQLite)에 최적화.
  • 대규모 배치 삽입 시 무작위 디스크 I/O, 캐시 축출, B-Tree 페이지 분할을 획기적으로 방지.
  • 밀리초당 74비트의 엔트로피를 제공하여 분산 마이크로서비스 환경에서도 충돌이 발생하지 않음.
  • 데이터베이스를 조회하지 않고도 생성 시점을 밀리초 단위로 즉시 디코딩 가능.
!

고려사항 및 제한점

  • 공개 URL에 노출될 경우 대략적인 생성 시각(밀리초 해상도)이 외부에 드러날 수 있음.
  • 동일 밀리초 내에 대량 생성 시 단조 증가(Monotonic) 카운터 관리가 권장됨.

권장 사용처

  • 관계형 및 문서형 데이터베이스의 기본 키(Primary Key, PostgreSQL, MySQL, CockroachDB, MongoDB).
  • 이벤트 스트리밍, 감사 로그, 메시지 큐(Kafka, RabbitMQ, SQS).
  • 시계열 데이터 및 순차 기록 장부.

지양해야 할 사용처

  • 생성 시각을 엄격하게 은폐해야 하는 일회용 보안 토큰이나 비밀 세션 쿠키.
  • 단순한 순차 증가 정수를 요구하는 시스템.

코드 구현 예제

Native Node.js / BrowserTypeScript / Node.js
// Browser / Node 22+ with Web Crypto
function generateUUIDv7(): string {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  const now = Date.now();

  bytes[0] = (now / 0x10000000000) & 0xff;
  bytes[1] = (now / 0x100000000) & 0xff;
  bytes[2] = (now / 0x1000000) & 0xff;
  bytes[3] = (now / 0x10000) & 0xff;
  bytes[4] = (now / 0x100) & 0xff;
  bytes[5] = now & 0xff;

  bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant

  return [...bytes].map((b, i) =>
    (i === 4 || i === 6 || i === 8 || i === 10 ? '-' : '') + b.toString(16).padStart(2, '0')
  ).join('');
}
Python (uuid6 / 3.14+)Python
import uuid6

new_id = uuid6.uuid7()
print(new_id) # e.g. 018e6a12-8921-71e4-8a4e-128a9b345678
PostgreSQL FunctionPostgreSQL
-- PostgreSQL 13+ native UUIDv7 generator
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid AS $$
DECLARE
  v_time numeric = extract(epoch FROM clock_timestamp()) * 1000;
  v_bytes bytea = gen_random_bytes(16);
BEGIN
  v_bytes = set_byte(v_bytes, 0, (v_time::bigint >> 40)::int);
  v_bytes = set_byte(v_bytes, 1, (v_time::bigint >> 32)::int);
  v_bytes = set_byte(v_bytes, 2, (v_time::bigint >> 24)::int);
  v_bytes = set_byte(v_bytes, 3, (v_time::bigint >> 16)::int);
  v_bytes = set_byte(v_bytes, 4, (v_time::bigint >> 8)::int);
  v_bytes = set_byte(v_bytes, 5, (v_time::bigint)::int);
  v_bytes = set_byte(v_bytes, 6, (get_byte(v_bytes, 6) & 15) | 112);
  v_bytes = set_byte(v_bytes, 8, (get_byte(v_bytes, 8) & 63) | 128);
  RETURN encode(v_bytes, 'hex')::uuid;
END;
$$ LANGUAGE plpgsql VOLATILE;

자주 묻는 질문

UUIDv4에서 UUIDv7으로 전환해야 하는 이유는 무엇인가요?
UUIDv4는 B-Tree 인덱스 전반에 무작위로 삽입되어 극심한 단편화를 일으킵니다. UUIDv7은 항상 인덱스 끝부분에 순차적으로 기록되어 쓰기 속도를 최대 4배까지 향상시킵니다.
기존 UUIDv4 컬럼과 호환되나요?
네, 100% 호환됩니다. 동일한 128비트 바이너리 및 36자 하이픈 문자열 규격을 사용하므로 데이터베이스 스키마 변경 없이 그대로 저장할 수 있습니다.
동일한 밀리초에 생성된 두 UUIDv7이 충돌할 수 있나요?
아닙니다. 밀리초마다 74비트의 엔트로피와 시퀀스 공간이 부여되므로 이론상 초당 수십억 개를 생성해도 충돌하지 않습니다.