UUID v2 Generator
Generate DCE Security UUID v2 with local domain and ID
Что такое 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_id | 32 | Локальный идентификатор: 32-битный домен-специфичный ID (обычно UID или GID POSIX). Заменяет time_low из UUID v1. |
| time_mid | 16 | time_mid: Биты 32-47 60-битной Gregorian-временной метки. |
| time_hi+version | 16 | time_hi_and_version: Биты 48-59 временной метки + 4-битная версия (<code>0010</code>). |
| variant+clock_hi | 8 | clock_seq_hi_and_reserved: Биты 8-13 тактового счётчика + биты варианта <code>10</code>. |
| local_domain | 8 | Локальный домен: 8-битный ID домена (0 = POSIX UID, 1 = POSIX GID, 2 = DCE Organization). |
| node | 48 | Узел: 48-битный MAC-адрес или случайный идентификатор. |
Пример UUID v2:
Локальные домены
8-битное поле локального домена определяет тип идентификатора:
Биты 3-255 зарезервированы и не определены в RFC 4122.
Почему UUID v2 такой редкий
UUID v2 практически не встречается в современном программном обеспечении:
Специфичный для DCE дизайн
UUID v2 разработан исключительно для механизма DCE/RPC, не применимого вне этого контекста.
Снижение точности временной метки
UUID v2 в одном 7-минутном интервале на одном хосте с одинаковым локальным ID будут идентичны.
Ограниченная реализация
Большинство UUID-библиотек не поддерживают v2. Пакет <code>uuid</code> npm намеренно его опускает.
История и контекст
Понимание 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 v1 | UUID v2 |
|---|---|---|
| Основа | Стандартный основанный на времени | Расширяет v1 |
| Поле time_low | 32 бита временной метки | 32-битный локальный ID (UID/GID) |
| Разрешение временной метки | 100 наносекунд | ~7 минут |
| Уникальность | Высокая | Ограниченная |
| Сценарий использования | Общий основанный на времени UUID | Аутентификация DCE/RPC |
| Поддержка в современных библиотеках | Широкая | Редкая/отсутствует |
| Рекомендован для новых проектов | Нет (используйте v7) | Нет |
UUID v2 существует по историческим причинам. Для новых проектов выбирайте UUID v4 или v7.
Примеры кода
Большинство библиотек не реализуют генерацию UUID v2. Примеры взаимодействия с UUID v2:
Обнаружение UUID v2 в JavaScript
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
// 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 идентифицируется по версии, поля декодируются вручную:
// 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
google/uuid поддерживает генерацию UUID v2 через uuid.NewDCEGroup() и uuid.NewDCEPerson() — один из немногих основных пакетов, который это делает.