Générateur UUID v2

Génère des UUID v2 DCE Security avec domaine local et ID

Cliquez sur Générer pour créer un UUID
Note :UUID v2 encode le domaine local et l'ID dans la structure de l'UUID
Note:UUID v2 est un format legacy défini pour les contextes de sécurité DCE. Il est rarement nécessaire dans les applications modernes. Pour les identifiants uniques à usage général, UUID v4 est recommandé.

Qu'est-ce qu'UUID v2 ?

UUID v2 est la version UUID de sécurité DCE, standardisée dans le cadre de la spécification Distributed Computing Environment (DCE) et référencée dans RFC 4122. Elle étend UUID v1 en intégrant un identifiant d'utilisateur ou de groupe POSIX (UID/GID) dans le champ d'horodatage.

La structure est similaire à UUID v1, mais le champ time_low de 32 bits est remplacé par un identifiant local de 32 bits (ex. un UID POSIX) et un champ local_domain d'1 octet identifie le type d'identifiant local. L'horodatage est tronqué en conséquence, réduisant sa précision et ses garanties d'unicité.

UUID v2 est extrêmement rare dans les logiciels modernes. La plupart des développeurs n'auront jamais besoin d'en générer un. Cette page documente le format par souci d'exhaustivité et pour aider au décodage des valeurs UUID v2 rencontrées dans les systèmes legacy.

Structure d'UUID v2

Un UUID v2 a le même format de 128 bits avec tirets que les autres versions UUID. Les champs diffèrent d'UUID v1 comme suit :

ChampBitsObjectif
local_id32<code>local_id</code> — identifiant de domaine local de 32 bits (ex. UID POSIX de <code>/etc/passwd</code>), remplace le champ time_low d'UUID v1
time_mid16<code>time_mid</code> — 16 bits du milieu de l'horodatage UUID v1 tronqué
time_hi+version16<code>time_hi_and_version</code> — 12 bits supérieurs de l'horodatage avec nibble de version défini à <code>2</code>
variant+clock_hi8<code>clock_seq_hi_and_reserved</code> — bits de variante plus la portion haute de la séquence d'horloge
local_domain8<code>local_domain</code> — identifiant de domaine : <code>0</code> = Utilisateur POSIX (UID), <code>1</code> = Groupe POSIX (GID), <code>2</code> = Organisation
node48<code>node</code> — adresse MAC de 48 bits de l'hôte générateur

Exemple : 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000, local_domain 0x00 = Utilisateur POSIX

Note:Comme le champ local_id remplace le champ time_low, l'horodatage dans UUID v2 ne fait que 28 bits de large (contre 60 bits dans UUID v1). Cela réduit la précision de l'horodatage à environ 7,2 minutes — les UUID générés dans la même fenêtre de 7 minutes depuis le même hôte/domaine/local_id ne sont peut-être pas uniques.

Valeurs de domaine local

L'octet local_domain spécifie le type d'identifiant local intégré dans l'UUID :

0POSIX_UID
ID Utilisateur POSIX — l'UID numérique de <code>/etc/passwd</code>, obtenu via <code>os.getuid()</code>
1POSIX_GID
ID Groupe POSIX — le GID numérique de <code>/etc/group</code>, obtenu via <code>os.getgid()</code>
2ORG
Organisation — un identifiant organisationnel de 32 bits personnalisé ; la sémantique est définie par l'application

Les valeurs de domaine sont définies par la spécification DCE. Les valeurs 3-255 sont réservées. En pratique, seul le domaine 0 (Personne/UID) est couramment rencontré dans les valeurs UUID v2 réelles.

Pourquoi UUID v2 est rarement utilisé

Trois caractéristiques rendent UUID v2 impraticable pour la plupart des applications modernes :

Résolution d'horodatage grossière

L'horodatage est tronqué à 28 bits (environ 7,2 minutes de granularité). Dans cette fenêtre, les UUID générés avec le même local_id et domaine sur le même hôte ne sont pas uniques — la spécification s'appuie sur le champ clock_seq pour les différencier, limitant l'unicité à 64 valeurs par fenêtre de 7 minutes.

Aucun support de bibliothèque standard

Contrairement à UUID v1 et v4, UUID v2 n'est pas supporté par la plupart des bibliothèques UUID. Le package npm uuid, le module Python uuid et java.util.UUID de Java omettent tous v2. Une implémentation personnalisée est requise.

Sémantique spécifique à POSIX

Le concept de domaine local (UID/GID) est intrinsèquement spécifique à POSIX et ne se transpose pas de manière significative à Windows, aux systèmes embarqués ou aux environnements cloud où le concept d'identifiant d'utilisateur POSIX est absent.

Warning:N'utilisez pas UUID v2 pour les nouveaux projets. Le format n'offre aucun avantage sur UUID v4 ou v7 pour les identifiants uniques à usage général. Si vous avez rencontré un UUID v2 dans un système legacy, utilisez cet outil pour décoder ses champs. Pour le nouveau développement, utilisez UUID v4.

Contexte historique

UUID v2 a été défini dans le cadre du Distributed Computing Environment (DCE/RPC) de l'Open Software Foundation au début des années 1990. L'objectif était de créer des UUID pouvant transporter un contexte d'autorisation — spécifiquement, permettre à un serveur RPC d'identifier l'utilisateur appelant sans étape d'authentification séparée.

Le modèle de sécurité DCE supposait un environnement POSIX homogène où chaque noeud participait à un espace de noms UID/GID partagé. L'UID intégré permettrait au serveur de vérifier rapidement les listes de contrôle d'accès sans aller-retour vers un service de répertoire.

  • Internet s'est éloigné des environnements POSIX homogènes vers des architectures cloud hétérogènes
  • L'authentification moderne utilise des jetons (JWT, OAuth) plutôt que des UID intégrés dans les identifiants
  • UUID v4 (entièrement aléatoire) et UUID v7 (ordonné dans le temps) couvrent les cas d'usage pratiques pour les identifiants uniques
  • DCE/RPC lui-même est tombé en désuétude

RFC 4122 (2005) a inclus UUID v2 par référence à la spécification DCE, mais a délibérément omis l'algorithme de génération détaillé — notant qu'il était défini par DCE plutôt que par l'IETF.

RFC 9562 (2024), qui a mis à jour la norme UUID, a conservé UUID v2 pour l'exhaustivité historique mais a continué à noter sa nature spécifique à POSIX et l'absence d'un algorithme de génération complet dans la norme IETF.

UUID v2 vs UUID v1

UUID v2 est dérivé d'UUID v1. Voici comment ils se comparent :

AspectUUID v1UUID v2
Bits d'horodatage60 bits (~précision 100ns)28 bits (~précision 7,2 min)
Identifiant localAucunUID/GID POSIX de 32 bits
Domaine localAbsent0=UID, 1=GID, 2=Org
Champ nodeAdresse MACAdresse MAC
Support bibliothèqueLargement supportéRarement supporté
StandardRFC 4122 / RFC 9562Spec DCE (référencée par RFC 4122)
Usage pratiqueIdentifiants ordonnés par horodatage legacy (Cassandra)Contextes de sécurité DCE uniquement

UUID v2 n'offre rien de plus qu'UUID v1 pour un usage général, et est strictement pire à la plupart des égards. Il n'y a aucune raison de choisir UUID v2 pour un nouveau développement.

Exemples de code

UUID v2 n'a aucun support natif dans les bibliothèques standard. Les exemples suivants montrent comment travailler avec les valeurs UUID v2 :

Python — implémentation manuelle

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

Go — note

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

JavaScript — extraire les champs

Pour extraire le local_id et le domaine d'une chaîne UUID v2 existante :

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:Le package Go google/uuid supporte la génération UUID v2 via uuid.NewDCEGroup() et uuid.NewDCEPerson() — l'une des rares bibliothèques mainstream à le faire.

Foire Aux Questions

Puis-je générer un UUID v2 en JavaScript ?
Aucune bibliothèque standard ne supporte la génération UUID v2 en JavaScript. Vous devriez construire les octets manuellement : prendre un UUID v1, remplacer le champ time_low (octets 0-3) par votre identifiant local, définir l'octet 9 à votre valeur de domaine, et définir le nibble de version à 2. Cet outil ne génère pas d'UUID v2 — il les décode seulement.
Que contient le champ local_id ?
Le local_id est un entier non signé de 32 bits dont la signification dépend de l'octet local_domain. Pour le domaine 0, c'est l'UID POSIX de l'utilisateur exécutant le processus (ex. 1000 pour le premier utilisateur non-root sur un système Linux). Pour le domaine 1, c'est le GID POSIX. Pour le domaine 2, la signification est définie par l'application.
L'horodatage dans un UUID v2 est-il fiable ?
Seulement comme indicateur approximatif. Comme seulement 28 bits des 60 bits de l'horodatage UUID v1 sont conservés, la précision effective est d'environ 7,2 minutes. Vous pouvez décoder un temps de génération approximatif, mais pas un temps précis. Dans une fenêtre de 7 minutes, plusieurs valeurs UUID v2 avec le même local_id et domaine depuis le même hôte auront des horodatages identiques.
Quels systèmes utilisent encore UUID v2 ?
UUID v2 est principalement rencontré dans les systèmes DCE/RPC legacy des années 1990, certaines versions du DCOM de Microsoft (basé sur DCE/RPC) et les anciens middlewares de calcul distribué. Les systèmes modernes utilisent presque universellement UUID v4 ou v7.
Pourquoi RFC 4122 n'inclut-il pas l'algorithme UUID v2 ?
RFC 4122 déclare explicitement que l'algorithme de génération UUID v2 est défini par la spécification DCE, pas par l'IETF. Comme l'IETF n'avait aucune autorité sur la spec DCE, ils n'ont inclus qu'une référence. C'est pourquoi la plupart des bibliothèques UUID qui suivent RFC 4122 omettent le support UUID v2.
UUID v2 est-il identique à un GUID ?
Non. GUID (Globally Unique Identifier) est le nom de Microsoft pour le même concept. Microsoft COM utilise des GUID UUID v1 et v4 en interne. UUID v2 n'est pas utilisé par l'infrastructure GUID Windows, bien que les deux dérivent des mêmes origines DCE/RPC.