Générateur UUID v3

Génère des UUID v3 déterministes basés sur le nom en utilisant MD5

Espace de noms

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

Nom

UUID v3 généré

Entrez un nom et cliquez sur Générer
Le même espace de noms + nom produit toujours le même UUID
Note:UUID v3 est un format legacy utilisant le hachage MD5. Pour un nouveau développement nécessitant des UUID déterministes, préférez UUID v5 (SHA-1). Pour les identifiants uniques à usage général, utilisez UUID v4.

Qu'est-ce qu'UUID v3 ?

UUID v3 est une version UUID basée sur un nom définie dans RFC 4122. Au lieu de données aléatoires ou d'un horodatage, il dérive l'UUID de manière déterministe à partir de deux entrées : un UUID espace de noms et une chaîne nom. La paire espace de noms + nom est hachée avec MD5, et le hachage résultant est formaté en UUID.

La propriété clé d'UUID v3 est le déterminisme : le même espace de noms et le même nom produiront toujours l'UUID identique, sur n'importe quelle machine, à n'importe quel moment. Cela le rend adapté à l'adressage de contenu — générer des identifiants stables pour des ressources identifiées par un nom significatif.

UUID v3 utilise MD5 comme fonction de hachage. MD5 est considéré comme cryptographiquement compromis à des fins de sécurité, c'est pourquoi UUID v5 (qui utilise SHA-1) est généralement préféré pour le nouveau développement. Ni v3 ni v5 ne fournissent de caractère aléatoire — ils sont purement déterministes.

Espaces de noms standard

RFC 4122 définit quatre UUID d'espace de noms pré-assignés. L'utilisation d'un espace de noms standard assure l'interopérabilité — deux implémentations indépendantes produiront le même UUID v3 pour le même nom dans le même espace de noms :

Espace de nomsUUIDUtiliser pour
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Noms de domaine entièrement qualifiés (ex. 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL et URI (ex. 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8Identifiants d'objet ISO (ex. '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8Noms distingués X.500 (ex. 'cn=John,dc=example,dc=com')

Vous pouvez également utiliser n'importe quel UUID arbitraire comme espace de noms personnalisé — par exemple, un UUID v4 que vous générez une fois et intégrez dans votre application comme constante. Cela vous permet de créer un espace de noms privé pour vos propres mappings nom-vers-UUID.

UUID v3 vs UUID v5

UUID v3 et UUID v5 sont structurellement identiques — tous deux sont des UUID déterministes basés sur un nom. La seule différence est la fonction de hachage :

UUID v3
  • Utilise le hachage MD5
  • Sortie de 128 bits (taille UUID)
  • Défini dans RFC 4122
  • MD5 est cryptographiquement compromis
  • Supporté par toutes les bibliothèques UUID
UUID v5
  • Utilise le hachage SHA-1
  • Hachage de 160 bits tronqué à 128 bits
  • Défini dans RFC 4122
  • SHA-1 est déprécié pour un usage sécurisé mais plus fort que MD5
  • Supporté par toutes les bibliothèques UUID

Préférez UUID v5 à UUID v3 pour tout nouveau développement. Le hachage SHA-1 est plus fort que MD5, et la différence de performance est négligeable. Utilisez UUID v3 uniquement quand vous devez reproduire des UUID d'un système qui l'utilise déjà.

Quand utiliser UUID v3

UUID v3 (et v5) sont appropriés quand vous avez besoin d'un identifiant stable et reproductible dérivé d'un nom significatif — plutôt qu'un identifiant aléatoire qui doit être stocké et récupéré :

Canonicalisation d'URL
Générez un UUID déterministe pour n'importe quelle URL à utiliser comme clé compacte de longueur fixe dans une base de données ou un cache — sans stocker de table de mapping.
Identifiants basés sur DNS
Attribuez des UUID stables aux noms d'hôtes ou de domaines qui restent cohérents à travers les déploiements et les bases de données.
Adressage de contenu
Créez des identifiants reproductibles pour les éléments de contenu identifiés par leur nom canonique — articles, produits ou clés de configuration.
Création idempotente de ressources
Générez le même UUID pour le même nom de ressource, afin que les tentatives de création répétées soient naturellement idempotentes sans recherche.
Fixtures de test
Produisez des UUID stables et prévisibles dans les données de test afin que les assertions de test n'aient pas besoin d'être mises à jour lors de la réexécution des tests.
Déduplication inter-systèmes
Deux systèmes indépendants peuvent dériver le même UUID pour le même nom sans communication, permettant la déduplication sans registre d'ID partagé.

Comprendre le déterminisme

Le déterminisme d'UUID v3 est à la fois sa plus grande force et sa contrainte la plus importante. Étant donné n'importe quel UUID d'espace de noms et n'importe quelle chaîne de nom, l'UUID de sortie est complètement fixe — aucun caractère aléatoire n'est impliqué. Cela signifie :

Exemple (espace de noms DNS, nom = 'example.com') :9073926b-929f-31c2-abc9-fad77ae3e8eb

Produit toujours : 9073926b-929f-31c2-abc9-fad77ae3e8eb

Si un attaquant connaît l'espace de noms et peut deviner le nom, il peut calculer l'UUID à l'avance. Les valeurs UUID v3 ne devraient jamais être utilisées comme jetons imprévisibles, identifiants de session ou secrets. Utilisez UUID v4 pour tout identifiant sensible à la sécurité.

Exemples de code

UUID v3 nécessite un UUID d'espace de noms et une chaîne de nom. Utilisez le package standard uuid :

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)
}

Foire Aux Questions

UUID v3 et UUID v5 sont-ils interchangeables ?
Non — ils produisent des sorties différentes pour les mêmes entrées car ils utilisent des fonctions de hachage différentes (MD5 vs SHA-1). Un UUID v3 et un UUID v5 générés à partir du même espace de noms + nom seront des UUID différents. Ils ne sont pas interchangeables, mais sont fonctionnellement équivalents en structure et en cas d'usage.
UUID v3 est-il résistant aux collisions ?
Dans un espace de noms donné, deux noms différents produiront des valeurs UUID v3 différentes tant que MD5 ne produit pas de collision pour ces entrées spécifiques. Les attaques par collision MD5 existent, mais elles nécessitent des entrées soigneusement conçues — en pratique, les noms naturellement présents (URL, noms de domaine, identifiants de produits) ne colleront pas. Pour une assurance plus élevée, utilisez UUID v5.
Puis-je utiliser UUID v3 comme clé primaire dans une base de données ?
Oui, si vous comprenez les compromis. UUID v3 est déterministe, donc la même clé sera générée pour le même nom — cela fournit une idempotence naturelle. Cependant, UUID v3 n'est pas triable par ordre de génération, et la fragmentation d'index s'applique tout comme avec UUID v4. Pour des clés primaires triables et ordonnées dans le temps, utilisez UUID v7.
Quel encodage dois-je utiliser pour l'entrée de nom ?
RFC 4122 spécifie que le nom doit être converti en octets en utilisant la forme canonique de l'espace de noms. Pour l'espace de noms DNS, utilisez le nom de domaine comme chaîne UTF-8 sans point final. Pour l'espace de noms URL, utilisez l'URL complète comme chaîne UTF-8. Utilisez toujours le même encodage de manière cohérente — différents encodages du même nom logique produiront des UUID différents.
UUID v3 cache-t-il le nom original ?
MD5 est une fonction unidirectionnelle — vous ne pouvez pas inverser un UUID v3 pour récupérer le nom original. Cependant, si un attaquant connaît l'espace de noms et suspecte un petit ensemble de noms possibles, il peut précalculer les valeurs UUID v3 pour chaque candidat et comparer. Pour les noms d'un espace petit ou prévisible, UUID v3 ne fournit aucune confidentialité. Utilisez UUID v4 si vous avez besoin d'un identifiant opaque et non devinable.