UUID 생성 도구
UUID(v1, v4, v5, v7) 생성 및 검증을 지원하며, 일괄 생성과 다양한 포맷 옵션을 제공하고 여러 언어의 코드 예제를 제공합니다.
사용 방법
UUID는 128비트 식별자로, 표준 형식은 하이픈으로 구분된 36자 문자열입니다.
UUID v1: 타임스탬프와 네트워크 카드 정보를 기반으로 생성되며, 시간 순서대로 정렬 가능하지만 시간/위치 정보 유출 가능성 있음.
UUID v4: 무작위 수를 기반으로 생성되며, 가장 일반적으로 사용되며 높은 고유성과 개인정보 보호성을 갖춤.
UUID v7: Unix 밀리초 타임스탬프 + 무작위 수를 기반으로 생성되며, 자연스럽게 정렬 가능하고 v1의 개인정보 유출 문제를 해결함.
UUID v5: 네임스페이스 UUID와 이름을 기반으로 SHA-1 해시를 통해 계산됨; 동일한 입력은 항상 동일한 결과를 생성함.
표준 형식: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36자)
기능 특징
- UUID v1, v4, v5, v7 지원
- 사용자 지정 개수의 일괄 생성 지원
- 유연한 포맷팅: 대문자, 하이픈 제거, 중괄호 추가
- 내장 검증기 및 버전 인식 기능
- 완전한 다국어 및 멀티 테마 지원
UUID란?
UUID는 128비트 식별자로, 표준 형식은 하이픈으로 구분된 36자 문자열입니다.
UUID v1: 타임스탬프와 네트워크 카드 정보를 기반으로 생성되며, 시간 순서대로 정렬 가능하지만 시간/위치 정보 유출 가능성 있음.
UUID v4: 무작위 수를 기반으로 생성되며, 가장 일반적으로 사용되며 높은 고유성과 개인정보 보호성을 갖춤.
UUID v7: Unix 밀리초 타임스탬프 + 무작위 수를 기반으로 생성되며, 자연스럽게 정렬 가능하고 v1의 개인정보 유출 문제를 해결함.
UUID v5: 네임스페이스 UUID와 이름을 기반으로 SHA-1 해시를 통해 계산됨; 동일한 입력은 항상 동일한 결과를 생성함.
UUID 주요 사용 사례
- 데이터베이스 레코드 또는 리소스의 고유 식별자
- 로그 및 이벤트 추적용 Trace ID
- 추측하기 어려운 공개 식별자
- 시스템 간 인터페이스에서의 통일된 식별자
UUID 자주 묻는 질문 및 주의사항
- v1과 개인정보: v1은 시간/위치 정보를 유출할 수 있으므로, 개인정보 보호가 중요하다면 v4를 권장합니다.
- 대소문자 구분 여부: 매칭 시 대소문자를 구분하지 않음
- 하이픈은 단지 표시용이며, 제약이 없다면 보존하는 것을 권장합니다.
- 중괄호 형식은 일부 환경(예: Windows 레지스트리)에서 허용됨
- v5는 결정적입니다(동일한 네임스페이스 + 이름 => 동일한 UUID). 멱등성 요구 시 적합하지만, 예측 불가능성이 필요한 경우에는 부적합합니다.
프로그래밍 언어에서 UUID 사용 방법
JavaScript
생성
// UUID v4 (simple)
function uuidv4(){
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
}
const id = uuidv4();
UUID v7(Unix 시간 + 무작위)
// UUID v7 (Unix ms + randomness)
function uuidv7(){
const cryptoObj = (globalThis.crypto || globalThis.msCrypto);
const rb = n => { const a = new Uint8Array(n); cryptoObj?.getRandomValues ? cryptoObj.getRandomValues(a) : a.forEach((_,i)=>a[i]=Math.random()*256|0); return a; };
const hex = b => Array.from(b).map(x=>x.toString(16).padStart(2,'0')).join('');
const ts = BigInt(Date.now()).toString(16).padStart(12,'0');
const ver = rb(2); ver[0] = (ver[0] & 0x0f) | 0x70; // set version 7
const vrn = rb(2); vrn[0] = (vrn[0] & 0x3f) | 0x80; // RFC4122 variant
const tail = rb(6);
return `${ts.slice(0,8)}-${ts.slice(8,12)}-${hex(ver)}-${hex(vrn)}-${hex(tail)}`;
}
const id7 = uuidv7();
검증
const re=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
re.test(id); // true/false
PHP
생성
<?php
// v4 using random_bytes
function uuidv4(){
$data = random_bytes(16);
$data[6] = chr((ord($data[6]) & 0x0f) | 0x40);
$data[8] = chr((ord($data[8]) & 0x3f) | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
$id = uuidv4();
UUID v7(Unix 시간 + 무작위)
<?php
// composer require ramsey/uuid:^4.7
use Ramsey\Uuid\Uuid;
$uuid7 = Uuid::uuid7();
검증
<?php
$re = '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i';
preg_match($re, $id) === 1; // true/false
Python
생성
import uuid
# v4
uid = uuid.uuid4()
# v1
uid1 = uuid.uuid1()
UUID v7(Unix 시간 + 무작위)
# pip install uuid6
from uuid6 import uuid7
uid7 = uuid7()
검증
import re
re_uuid = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I)
bool(re_uuid.match(str(uid)))
Go
생성
// go get github.com/google/uuid
import "github.com/google/uuid"
id := uuid.New() // v4
id1 := uuid.NewUUID() // v1 (may return error)
UUID v7(Unix 시간 + 무작위)
// go get github.com/gofrs/uuid/v5
import (
uuid "github.com/gofrs/uuid/v5"
)
id7, err := uuid.NewV7()
검증
import "github.com/google/uuid"
_, err := uuid.Parse(id.String()) // err == nil means valid
Rust
생성
// Cargo.toml: uuid = { version = "1", features = ["v4", "v1"] }
use uuid::Uuid;
let v4 = Uuid::new_v4();
// v1 requires a context/ts, often via external crate; shown for completeness
UUID v7(Unix 시간 + 무작위)
// Cargo.toml: uuid = { version = "1", features = ["v7"] }
use uuid::Uuid;
let v7 = Uuid::now_v7();
검증
use uuid::Uuid;
let ok = Uuid::parse_str(v4.to_string().as_str()).is_ok();
Java
생성
import java.util.UUID;
UUID id = UUID.randomUUID(); // v4
UUID v7(Unix 시간 + 무작위)
// Maven: com.github.f4b6a3:uuid-creator
import com.github.f4b6a3.uuid.UuidCreator;
UUID v7 = UuidCreator.getTimeOrderedEpoch(); // UUIDv7
검증
import java.util.UUID;
try { UUID.fromString(id.toString()); /* valid */ } catch (IllegalArgumentException ex) { /* invalid */ }