UUID v2 Generator

Generate DCE Security UUID v2 with local domain and ID

Нажмите «Сгенерировать» для создания UUID
Примечание:UUID v2 кодирует локальный домен и ID в структуру UUID
Note:UUID v2 (DCE Security UUID) — редкая специализированная версия для аутентификации DCE/RPC. Она заменяет части временной метки UUID v1 UID/GID POSIX, что делает v2 пригодным лишь для нескольких узкоспециализированных случаев.

Что такое UUID v2?

UUID v2 («DCE Security UUID») — расширение UUID v1, разработанное для аутентификации DCE (Distributed Computing Environment). Стандартизировано как часть спецификации DCE 1.1 в начале 1990-х.

UUID v2 заменяет нижние 32 бита временной метки UUID v1 32-битным локальным идентификатором (UID или GID пользователя POSIX), встраивая информацию об авторизации прямо в UUID.

На практике UUID v2 крайне редко встречается за пределами устаревших систем DCE.

Структура UUID v2

UUID v2 разделяет большую часть структуры с UUID v1, но заменяет поле time_low доменным идентификатором:

ПолеБитыНазначение
local_id32Локальный идентификатор: 32-битный домен-специфичный ID (обычно UID или GID POSIX). Заменяет time_low из UUID v1.
time_mid16time_mid: Биты 32-47 60-битной Gregorian-временной метки.
time_hi+version16time_hi_and_version: Биты 48-59 временной метки + 4-битная версия (<code>0010</code>).
variant+clock_hi8clock_seq_hi_and_reserved: Биты 8-13 тактового счётчика + биты варианта <code>10</code>.
local_domain8Локальный домен: 8-битный ID домена (0 = POSIX UID, 1 = POSIX GID, 2 = DCE Organization).
node48Узел: 48-битный MAC-адрес или случайный идентификатор.

Пример UUID v2:

Note:Замена нижних 32 бит временной метки снижает её точность примерно до 7 минут вместо 100 наносекунд.

Локальные домены

8-битное поле локального домена определяет тип идентификатора:

0POSIX_UID
UID пользователя POSIX (0-4294967295). Чаще всего в реализациях DCE.
1POSIX_GID
GID группы POSIX (0-4294967295).
2ORG
Идентификатор организации DCE — специфический для реализации.

Биты 3-255 зарезервированы и не определены в RFC 4122.

Почему UUID v2 такой редкий

UUID v2 практически не встречается в современном программном обеспечении:

Специфичный для DCE дизайн

UUID v2 разработан исключительно для механизма DCE/RPC, не применимого вне этого контекста.

Снижение точности временной метки

UUID v2 в одном 7-минутном интервале на одном хосте с одинаковым локальным ID будут идентичны.

Ограниченная реализация

Большинство UUID-библиотек не поддерживают v2. Пакет <code>uuid</code> npm намеренно его опускает.

Warning:Не используйте UUID v2 для общих целей. Используйте UUID v4 или v7.

История и контекст

Понимание UUID v2 требует краткой истории DCE (Distributed Computing Environment).

DCE — набор спецификаций промежуточного слоя, разработанный OSF в конце 1980-х — начале 1990-х:

  • DCE/RPC — механизм удалённого вызова процедур.
  • DFS — служба каталогов для распределённых ресурсов.
  • Kerberos — служба аутентификации.
  • UUID — уникальная идентификация интерфейсов и ресурсов RPC.

UUID v2 разработан для механизма авторизации DCE (PAC). Встраивая UID/GID POSIX в UUID, служба могла проверять права без дополнительных запросов.

DCE был широко принят в 1990-х, но вытеснен HTTP/REST и gRPC к началу 2000-х.

UUID v2 против UUID v1

Прямое сравнение UUID v2 и UUID v1:

АспектUUID v1UUID v2
ОсноваСтандартный основанный на времениРасширяет v1
Поле time_low32 бита временной метки32-битный локальный ID (UID/GID)
Разрешение временной метки100 наносекунд~7 минут
УникальностьВысокаяОграниченная
Сценарий использованияОбщий основанный на времени UUIDАутентификация DCE/RPC
Поддержка в современных библиотекахШирокаяРедкая/отсутствует
Рекомендован для новых проектовНет (используйте v7)Нет

UUID v2 существует по историческим причинам. Для новых проектов выбирайте UUID v4 или v7.

Примеры кода

Большинство библиотек не реализуют генерацию UUID v2. Примеры взаимодействия с UUID v2:

Обнаружение UUID v2 в JavaScript

Python
import uuid, struct, time

def uuid_v2(local_id: int, local_domain: int = 0) -> str:
    """
    Generate a DCE Security UUID (v2).
    local_domain: 0 = POSIX UID, 1 = POSIX GID, 2 = Org
    local_id: 32-bit unsigned integer (e.g. os.getuid())
    """
    # Get a v1 UUID for the time and node fields
    v1 = uuid.uuid1()
    fields = list(v1.fields)  # [time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node]

    # Replace time_low with local_id
    fields[0] = local_id & 0xFFFFFFFF

    # Replace version nibble: clear lower 12 bits of time_hi, set version 2
    fields[2] = (fields[2] & 0x0FFF) | 0x2000

    # Replace clock_seq_low with local_domain
    fields[4] = local_domain & 0xFF

    return str(uuid.UUID(fields=tuple(fields)))


import os
print(uuid_v2(os.getuid(), local_domain=0))   # POSIX UID
print(uuid_v2(os.getgid(), local_domain=1))   # POSIX GID

Извлечение полей UUID v2 в Python

Go
// The standard "github.com/google/uuid" package does NOT support v2.
// You would need to implement it manually, similar to the Python example above.
// Most Go developers use v4 or v7 for new projects.
import "github.com/google/uuid"

v4 := uuid.New()          // v4 — recommended for most use cases
v7, _ := uuid.NewV7()     // v7 — time-ordered, ideal for database primary keys

Извлечение UUID v2 в Go

UUID v2 идентифицируется по версии, поля декодируются вручную:

JavaScript
// Extracting fields from a UUID v2 string
const uuidStr = '000003e8-1234-2abc-8200-a1b2c3d4e5f6'
//               ^^^^^^^^ ^^^^ ^    ^^
//               local_id      ver  variant+clockSeqHi
//                                  ^^ = local_domain (00 = POSIX UID)

const parts = uuidStr.split('-')

const localId     = parseInt(parts[0], 16)       // → 1000 (0x3e8)
const version     = parseInt(parts[2][0], 16)    // → 2
const localDomain = parseInt(parts[3].slice(2), 16) // low byte of octet pair

const DOMAIN_NAMES = ['POSIX UID', 'POSIX GID', 'Org']
console.log(`Local ID: ${localId}`)                       // Local ID: 1000
console.log(`Version:  ${version}`)                       // Version:  2
console.log(`Domain:   ${DOMAIN_NAMES[localDomain]}`)     // Domain:   POSIX UID
Note:Пакет Go google/uuid поддерживает генерацию UUID v2 через uuid.NewDCEGroup() и uuid.NewDCEPerson() — один из немногих основных пакетов, который это делает.

Часто задаваемые вопросы

Какова реальная цель UUID v2?
UUID v2 разработан для аутентификации DCE/RPC: встраивая UID/GID POSIX, служба авторизации могла проверять права без обращения к базе данных.
Могу ли я использовать UUID v2 как первичный ключ?
Технически да, но крайне не рекомендуется. UUID v2 не уникальны в 7-минутных окнах. Используйте UUID v4 или v7.
Почему UUID v2 не реализован в большинстве библиотек?
DCE вышел из употребления. Нет активного варианта использования, требующего генерации v2.
Как декодировать UUID v2?
Инструмент UUID Decoder автоматически определяет и декодирует UUID v2, извлекая версию, локальный домен и идентификатор.
Является ли UUID v2 частью современной спецификации UUID?
Он определён в RFC 4122 (2005), но RFC 9562 (2024) его не упоминает — он более не считается актуальным.
Является ли UUID v2 безопасным?
Нет: содержит MAC-адрес и UID/GID POSIX (конфиденциальность). Также нет: ограниченное разрешение временной метки допускает коллизии в 7-минутных окнах.