UUID v3 Generator

Generate deterministic name-based UUID v3 using MD5

Пространство имён

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

Имя

Сгенерированный UUID v3

Введите имя и нажмите «Сгенерировать»
Одинаковые пространство имён + имя всегда дают одинаковый UUID
Note:UUID v3 детерминирован: одинаковые входные данные всегда дают одинаковый UUID. Для воспроизводимых идентификаторов из известных входных данных — правильный выбор. Для случайных идентификаторов общего назначения используйте UUID v4.

Что такое UUID v3?

UUID v3 — детерминированная версия UUID, определённая в RFC 4122. UUID v3 генерируется путём хэширования пространства имён и имени с помощью MD5. Одинаковое пространство имён + имя всегда даёт одинаковый UUID — на любой машине, в любое время.

Детерминизм — и сильная сторона, и ограничение. UUID v3 непредсказуемым не является: зная пространство имён и имя, UUID можно вычислить.

UUID v3 использует MD5, который больше не считается криптографически защищённым. RFC 4122 рекомендует UUID v5 (SHA-1) для новых применений.

Предопределённые пространства имён

RFC 4122 определяет четыре стандартных пространства имён для v3 и v5:

ИмяUUID пространства имёнИспользование
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Хэширование доменных имён (например, <code>example.com</code>)
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8Хэширование URL (например, <code>https://example.com/page</code>)
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8Хэширование идентификаторов объектов ASN.1
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8Хэширование различающихся имён X.500/LDAP

Вы можете использовать любой UUID как пользовательское пространство имён, чтобы изолировать свои UUID от других проектов.

UUID v3 против UUID v5

Оба детерминированы, различаются только алгоритмом хэширования:

UUID v3 (MD5)
  • Использует хэширование MD5
  • 128-битный выход (используется 122 бита)
  • MD5 криптографически нарушен
  • Широко поддерживается в устаревших системах
  • Используйте только для обратной совместимости
UUID v5 (SHA-1)
  • Использует хэширование SHA-1
  • 160-битный выход (используется 122 бита)
  • SHA-1 нарушен для коллизий, но лучше MD5
  • Рекомендован RFC 4122 вместо v3
  • Используйте для новых реализаций

Рекомендация: для новых реализаций используйте UUID v5. UUID v3 — для обратной совместимости.

Когда использовать UUID v3

UUID v3 (и v5) уместны, когда нужен воспроизводимый детерминированный идентификатор:

Стабильные ID для именованных ресурсов
URL, DNS-имена или пути к файлам всегда отображаются на одинаковый UUID v3.
Дедупликация данных
UUID из содержимого записи позволяет обнаружить дубликаты: одинаковые входные данные → одинаковый UUID.
Сопоставление между системами
Записи из разных систем сопоставляются одним и тем же алгоритмом без таблицы сопоставления.
Детерминированные тестовые данные
Воспроизводимые тестовые ID из известных входных данных.
Идентификаторы с адресацией по содержимому
Идентификация ресурсов по содержимому, а не по случайным ID.
Отображение унаследованных ID
Преобразование числовых или строковых ID унаследованной системы в UUID без таблицы сопоставления.

Алгоритм детерминизма

Как генерируется UUID v3:

Шаги алгоритма:9073926b-929f-31c2-abc9-fad77ae3e8eb

1. UUID пространства имён → 16 байт. 2. Объединить с байтами имени UTF-8. 3. Вычислить MD5 хэш. 4. Установить версию 0011 (3) в байте 6. 5. Установить вариант 10 в байте 8. 6. Представить как стандартный UUID.

Одинаковые входные данные → одинаковый хэш → одинаковый UUID. Нет случайности, нет временной метки.

Примеры кода

Все основные UUID-библиотеки поддерживают v3:

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?
Да, всегда. Одинаковое пространство имён + имя → одинаковый UUID, на любой машине и языке.
Может ли кто-то обратить UUID v3, чтобы получить исходное имя?
MD5 — односторонняя функция. Прямое обращение невозможно. Однако предсказуемые входные данные можно определить перебором.
Можно ли использовать пользовательские пространства имён?
Да. Любой действительный UUID может быть пространством имён. Распространённая практика — использовать UUID v4 проекта в качестве пространства имён.
Являются ли UUID v3 детерминированными по разным языкам?
Да, при соблюдении спецификации: MD5(байты пространства имён + байты имени UTF-8) с установкой битов версии и варианта.
Что происходит, если два имени дают одинаковый UUID v3?
Это коллизия хэша. MD5 теоретически уязвим, хотя практически это редко. Для критичных случаев используйте UUID v5.