UUID v3 생성기

Generate deterministic name-based UUID v3 using MD5

네임스페이스

6ba7b810-9dad-11d1-80b4-00c04fd430c8

이름

생성된 UUID v3

이름을 입력하고 생성 버튼을 클릭하세요
동일한 네임스페이스 + 이름은 항상 동일한 UUID를 생성합니다
Note:UUID v3는 MD5 해싱을 사용하는 레거시 형식입니다. 결정론적 UUID가 필요한 새 개발에서는 UUID v5(SHA-1)를 선호하세요. 범용 고유 ID에는 UUID v4를 사용하세요.

UUID v3이란 무엇인가요?

UUID v3은 RFC 4122에 정의된 이름 기반 UUID 버전입니다. 무작위 데이터나 타임스탬프 대신 네임스페이스 UUID와 이름 문자열 두 입력에서 UUID를 결정론적으로 파생합니다. 네임스페이스 + 이름 쌍은 MD5로 해시되고 결과 해시가 UUID로 포맷됩니다.

UUID v3의 핵심 속성은 결정론입니다: 동일한 네임스페이스와 이름은 어느 머신에서나 언제나 동일한 UUID를 생성합니다. 이로 인해 의미 있는 이름으로 식별되는 리소스의 안정적 식별자를 생성하는 콘텐츠 주소 지정에 적합합니다.

UUID v3은 해시 함수로 MD5를 사용합니다. MD5는 보안 목적으로 암호학적으로 손상된 것으로 간주되며 이것이 UUID v5(SHA-1 사용)가 새 개발에 일반적으로 선호되는 이유입니다.

표준 네임스페이스

RFC 4122는 4개의 사전 할당된 네임스페이스 UUID를 정의합니다. 표준 네임스페이스를 사용하면 상호 운용성이 보장됩니다——두 독립 구현이 동일한 네임스페이스 내의 동일한 이름에 대해 동일한 UUID v3을 생성합니다:

네임스페이스UUID사용 대상
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8완전히 정규화된 도메인 이름(예: 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL 및 URI(예: 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8ISO 개체 식별자(예: '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8X.500 고유 이름(예: 'cn=John,dc=example,dc=com')

임의의 UUID를 맞춤 네임스페이스로 사용할 수도 있습니다——예를 들어 한 번 생성하여 애플리케이션에 상수로 내장한 UUID v4. 이를 통해 자체 이름-UUID 매핑을 위한 개인 네임스페이스를 만들 수 있습니다.

UUID v3 대 UUID v5

UUID v3과 UUID v5는 구조적으로 동일합니다——둘 다 결정론적 이름 기반 UUID입니다. 유일한 차이점은 해시 함수입니다:

UUID v3
  • MD5 해싱 사용
  • 128비트 출력(UUID 크기)
  • RFC 4122에 정의
  • MD5는 암호학적으로 손상됨
  • 모든 UUID 라이브러리에서 지원
UUID v5
  • SHA-1 해싱 사용
  • 160비트 해시를 128비트로 자름
  • RFC 4122에 정의
  • SHA-1은 보안용으로 더 이상 사용되지 않지만 MD5보다 강함
  • 모든 UUID 라이브러리에서 지원

모든 새 개발에서 UUID v3보다 UUID v5를 선호하세요. SHA-1 해시가 MD5보다 강하고 성능 차이는 무시할 수 있습니다. 이미 사용 중인 시스템에서 UUID를 재현해야 할 때만 UUID v3을 사용하세요.

UUID v3을 사용할 때

UUID v3(및 v5)은 저장하고 조회해야 하는 무작위 ID 대신 의미 있는 이름에서 파생된 안정적이고 재현 가능한 식별자가 필요할 때 적합합니다:

URL 정규화
매핑 테이블을 저장하지 않고 데이터베이스나 캐시의 컴팩트 고정 길이 키로 사용하기 위해 URL에 대한 결정론적 UUID를 생성합니다.
DNS 기반 식별자
배포 및 데이터베이스 전반에 걸쳐 일관된 호스트명이나 도메인 이름에 안정적인 UUID를 할당합니다.
콘텐츠 주소 지정
정규 이름으로 식별된 콘텐츠 항목——기사, 제품, 또는 구성 키——의 재현 가능한 ID를 만듭니다.
멱등적 리소스 생성
동일한 리소스 이름에 대해 동일한 UUID를 생성하여 반복 생성 시도가 자연스럽게 멱등적이 되도록 조회 없이.
테스트 픽스처
테스트 데이터에서 안정적이고 예측 가능한 UUID를 생성하여 테스트를 다시 실행할 때 테스트 어설션을 업데이트할 필요가 없습니다.
교차 시스템 중복 제거
두 독립 시스템이 통신 없이 동일한 이름에 대해 동일한 UUID를 파생할 수 있어 공유 ID 레지스트리 없이 중복 제거가 가능합니다.

결정론 이해

UUID v3의 결정론은 가장 큰 강점이자 가장 중요한 제약입니다. 어떤 네임스페이스 UUID와 어떤 이름 문자열이 주어지더라도 출력 UUID는 완전히 고정됩니다——무작위성이 관여하지 않습니다. 즉:

예(DNS 네임스페이스, 이름 = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

항상 생성: 9073926b-929f-31c2-abc9-fad77ae3e8eb

공격자가 네임스페이스를 알고 이름을 추측할 수 있다면 UUID를 미리 계산할 수 있습니다. UUID v3 값은 예측 불가능한 토큰, 세션 ID, 또는 비밀로 절대 사용하지 마세요. 보안에 민감한 식별자에는 UUID v4를 사용하세요.

코드 예제

UUID v3에는 네임스페이스 UUID이름 문자열이 필요합니다. 표준 uuid 패키지를 사용하세요:

JavaScript / Node.js
// Browser / Node.js — UUID v3 without dependencies
function uuidV3(namespace, name) {
  // namespace must be a UUID string like '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
  const nsBytes = namespace.replace(/-/g, '').match(/../g).map(h => parseInt(h, 16))
  const nameBytes = [...new TextEncoder().encode(name)]
  const combined = new Uint8Array([...nsBytes, ...nameBytes])

  // md5(combined) — use your preferred MD5 library or the inline implementation
  const hash = md5(combined) // returns Uint8Array(16)
  hash[6] = (hash[6] & 0x0f) | 0x30 // version 3
  hash[8] = (hash[8] & 0x3f) | 0x80 // variant

  const h = [...hash].map(b => b.toString(16).padStart(2, '0')).join('')
  return `${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20)}`
}

// Using the 'uuid' npm package
import { v3 as uuidv3 } from 'uuid'
const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
console.log(uuidv3('example.com', uuidv3.DNS))
// → '9073926b-929f-31c2-abc9-fad77ae3e8eb' (always the same)
Python
import uuid

# Using the standard library
dns_uuid = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print(dns_uuid)
# → 9073926b-929f-31c2-abc9-fad77ae3e8eb

url_uuid = uuid.uuid3(uuid.NAMESPACE_URL, 'https://example.com/page')
print(url_uuid)

# Custom namespace
MY_NS = uuid.UUID('a1b2c3d4-e5f6-7890-abcd-ef1234567890')
custom = uuid.uuid3(MY_NS, 'my-entity-name')
print(custom)
Go
package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    // Standard DNS namespace
    ns := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
    id := uuid.NewMD5(ns, []byte("example.com"))
    fmt.Println(id)
    // → 9073926b-929f-31c2-abc9-fad77ae3e8eb

    // URL namespace
    urlNS := uuid.MustParse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")
    idURL := uuid.NewMD5(urlNS, []byte("https://example.com/page"))
    fmt.Println(idURL)
}

자주 묻는 질문

UUID v3과 UUID v5는 상호 교환 가능한가요?
아닙니다——다른 해시 함수(MD5 대 SHA-1)를 사용하기 때문에 동일한 입력에 대해 다른 출력을 생성합니다. 동일한 네임스페이스 + 이름에서 생성된 UUID v3과 UUID v5는 서로 다른 UUID가 됩니다.
UUID v3는 충돌 방지 기능이 있나요?
주어진 네임스페이스 내에서 MD5가 특정 입력에 대해 충돌을 생성하지 않는 한 두 다른 이름은 다른 UUID v3 값을 생성합니다. MD5 충돌 공격이 존재하지만 신중하게 만들어진 입력이 필요합니다——실제로 자연스럽게 발생하는 이름(URL, 도메인 이름, 제품 ID)은 충돌하지 않습니다.
UUID v3를 데이터베이스 기본 키로 사용할 수 있나요?
예, 트레이드오프를 이해한다면. UUID v3는 결정론적이므로 동일한 이름은 동일한 키를 생성합니다——자연스러운 멱등성을 제공합니다. 그러나 UUID v3는 생성 순서로 정렬할 수 없으며 UUID v4와 마찬가지로 인덱스 단편화가 적용됩니다.
이름 입력에 어떤 인코딩을 사용해야 하나요?
RFC 4122는 이름이 네임스페이스의 표준 형식을 사용하여 바이트로 변환되어야 한다고 지정합니다. DNS 네임스페이스의 경우 끝 점 없이 UTF-8 문자열로 도메인 이름을 사용하세요. 항상 동일한 인코딩을 일관되게 사용하세요——동일한 논리적 이름의 다른 인코딩은 다른 UUID를 생성합니다.
UUID v3는 원래 이름을 숨기나요?
MD5는 단방향 함수입니다——UUID v3에서 원래 이름을 되돌릴 수 없습니다. 그러나 공격자가 네임스페이스를 알고 작은 가능한 이름 집합을 의심한다면 각 후보에 대한 UUID v3 값을 미리 계산하여 비교할 수 있습니다.