UUID 버전 7 생성기
UUIDv7 • 시간 순 정렬 표준 (RFC 9562)
00000000-0000-0000-0000-000000000000
감싸기:
UUID 대량 배치 생성
0 msReady
최대 5,000개
형식 및 구조 설정
준비 완료
No batch active1-click copy available on each row
최신 표준 규격 (2024)•RFC 9562 섹션 5.7
UUID 버전 7 기술 사양 (RFC 9562)
UUIDv7은 48비트의 밀리초 단위 Unix Epoch 타임스탬프와 74비트의 암호학적 난수 엔트로피 및 시퀀스 데이터를 결합한 차세대 식별자입니다. 기존 UUIDv4의 무작위 키로 인해 발생하던 데이터베이스 B-Tree 인덱스 단편화와 페이지 분할 문제를 근본적으로 해결하기 위해 RFC 9562(2024년 제정)에서 표준화되었습니다.
비트필드 레이아웃 및 바이너리 구조
RFC 표준에 따른 128비트 바이트 세부 구조입니다.
| 필드 이름 | 비트 범위 | 용도 및 설명 |
|---|---|---|
| unix_ts_ms | 48비트 (0-47) | 밀리초 단위 부호 없는 빅엔디안 Unix Epoch 타임스탬프. |
| ver | 4비트 (48-51) | 고정 바이너리 값 0111 (버전 7 식별). |
| rand_a | 12비트 (52-63) | 무작위 엔트로피 또는 밀리초 미만 시퀀스 카운터. |
| var | 2비트 (64-65) | 고정 바이너리 값 10 (RFC 4122/9562 표준 변형). |
| rand_b | 62비트 (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-128a9b345678PostgreSQL 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비트의 엔트로피와 시퀀스 공간이 부여되므로 이론상 초당 수십억 개를 생성해도 충돌하지 않습니다.