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() — один із небагатьох основних бібліотек, що це робить.