Service en ligne 100% Gratuit Utilitaires Web AngularForAll

- Générateur UUID / GUID en ligne

Uuid V4 Generator Online Générateur Uuid Guid En Ligne Generate Uuid Javascript Crypto Uuid V7 Primary Key Database Guid Generator Free Uuid Bulk Generator Crypto Randomuuid Javascript Uuid Format Sans Tirets Accolades Urn Identifiant Unique Universel Uuid Vs Auto Increment Database

Générez des UUID v4, v1 et v7 instantanément dans votre navigateur. Bulk (1-100), format personnalisable (tirets, accolades, URN), copie en un clic. 100% client-side.

🔑

Générateur UUID / GUID

UUID v4 — 100% aléatoire. Le standard de facto pour les identifiants uniques. Probabilité de collision : quasi nulle (1 sur 5,3 × 10³⁶).
1 à 100

Qu'est-ce qu'un UUID / GUID et à quoi ça sert ?

Un UUID (Universally Unique Identifier) — aussi appelé GUID (Globally Unique Identifier) dans l'écosystème Microsoft — est un identifiant de 128 bits standardisé par la RFC 4122. Il se représente sous la forme de 32 caractères hexadécimaux regroupés en 5 blocs séparés par des tirets :

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

-- Exemple UUID v4 :
550e8400-e29b-41d4-a716-446655440000
│        │    │    │    └─ Nœud (48 bits)
│        │    │    └────── Variant (2 bits) + Clock seq (14 bits)
│        │    └─────────── Version (4 bits) + Time hi (12 bits)
│        └──────────────── Time mid (16 bits)
└───────────────────────── Time low (32 bits)

Le bit M indique la version (1, 3, 4, 5 ou 7) et le bit N le variant (RFC 4122 impose 10xx → valeurs 8, 9, a ou b en hexadécimal).

Pourquoi utiliser des UUIDs plutôt que des auto-incréments ?

Critère Auto-incrément (INT) UUID v4
Unicité globale ❌ Locale à une table/BDD ✅ Universelle (sans coordination)
Prédictibilité ❌ Enumérable (faille IDOR) ✅ Imprévisible
Fusion de BDD / microservices ❌ Conflits d'ID quasi certains ✅ Aucun conflit
Génération côté client ❌ Nécessite un aller-retour serveur ✅ Possible avant insertion
Taille stockage ✅ 4 octets (INT32) ⚠️ 16 octets (ou 36 chars)
Performance index BTree ✅ Séquentiel — optimal ⚠️ Aléatoire — fragmentation (v4)

Cas d'usage typiques des UUIDs

  • IDs de ressources API REST : /users/550e8400-e29b-41d4-a716-446655440000
  • Microservices : chaque service génère ses IDs indépendamment, sans coordinateur central
  • Systèmes distribués : Kafka, Cassandra, DynamoDB utilisent des UUIDs nativement
  • Tokens one-time : liens de vérification email, réinitialisation de mot de passe
  • Nommage de fichiers : éviter les collisions lors d'uploads concurrents
  • Idempotency keys : prévenir les doublons dans les paiements Stripe, les requêtes HTTP

Les versions UUID : v1, v4, v5, v7 — comment choisir ?

La RFC 4122 définit 5 versions d'UUID. Une 6ème (v6) et une 7ème (v7) ont été proposées dans un draft IETF pour corriger les limitations de performance de v1 et v4. Voici un guide de choix pratique.

UUID v1 — horodatage + nœud MAC

L'UUID v1 encode l'heure courante (en intervalles de 100 nanosecondes depuis le 15 octobre 1582) et l'adresse MAC de la machine. Il est ordonnable chronologiquement et friendly pour les index BTree.

// UUID v1 — les 8 premiers caractères changent avec le temps
// Mais l'ordre des bits n'est pas chronologique dans le format standard
1a8b3c00-f29b-11ed-a716-001a2b3c4d5e
         ↑ version=1

// ⚠️ Problème sécurité : révèle l'heure exacte et l'adresse MAC
// → Ne pas utiliser pour des tokens secrets
Note : En navigateur, l'adresse MAC réelle n'est pas accessible. Notre générateur utilise 6 octets aléatoires comme nœud, ce qui est conforme à la RFC 4122 (le bit multicast est forcé à 1 pour indiquer un nœud aléatoire).

UUID v4 — 100% aléatoire (le plus utilisé)

122 bits aléatoires, 4 bits de version, 2 bits de variant. C'est le standard de facto pour la grande majorité des cas d'usage. La probabilité de collision est négligeable : il faudrait générer 2,71 × 10¹⁸ UUIDs pour avoir 50% de chance de collision.

// UUID v4 — JavaScript (API moderne, Node 14.17+ / tous navigateurs modernes)
const id = crypto.randomUUID();
// → "550e8400-e29b-41d4-a716-446655440000"

// Vérifier le support
if (typeof crypto.randomUUID === 'function') {
    const id = crypto.randomUUID();
} else {
    // Fallback avec getRandomValues
    const bytes = new Uint8Array(16);
    crypto.getRandomValues(bytes);
    bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
    bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant RFC 4122
    // ... convertir en string hexadécimale
}

UUID v5 — hash déterministe (SHA-1)

L'UUID v5 génère un identifiant déterministe à partir d'un namespace et d'un nom. Le même couple (namespace, nom) produit toujours le même UUID. Utile pour créer des IDs stables à partir de données métier.

// UUID v5 — Python (lib uuid standard)
import uuid

# Namespace prédéfini DNS + nom de domaine
uid = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')
print(uid)  # → "cfbff0d1-9375-5685-968c-48ce8b15ae17"
# Toujours identique pour ce couple (NAMESPACE_DNS, 'example.com')

# UUID v3 — même principe mais avec MD5 (obsolète, préférer v5)
uid3 = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')

UUID v7 — horodatage ms + aléatoire (recommandé pour les BDD)

Proposé dans le draft IETF RFC 9562 (2024), UUID v7 combine les avantages de v1 (ordonnable) et de v4 (aléatoire) tout en plaçant le timestamp en position big-endian dans les premiers bits. Résultat : tri chronologique natif et insertion BTree sans fragmentation.

// Structure UUID v7
// [48 bits timestamp ms][4 bits version=7][12 bits aléatoire]
// [2 bits variant][62 bits aléatoire]

01861f34-3a2b-7c94-8d12-1e4a5b6c7d8e
↑ timestamp Unix ms en big-endian → triable !

// PostgreSQL 17+ supporte UUID v7 nativement via gen_random_uuid()
// MySQL 8.4+ : UUID() génère du v1, utiliser une fonction custom pour v7

Tableau récapitulatif de choix

Version Aléatoire Ordonnable Déterministe Recommandé pour
v1 Partiel ⚠️ Bits inversés Non Compatibilité legacy
v4 ✅ 122 bits Non Non Tokens, IDs API, général
v5 Non Non ✅ SHA-1 IDs stables depuis données
v7 ✅ 74 bits ✅ Natif Non Clés primaires BDD, NoSQL

Générer des UUIDs en JavaScript et Node.js

Depuis 2021, tous les navigateurs modernes et Node.js 14.17+ exposent crypto.randomUUID() — une API native, cryptographiquement sécurisée, sans dépendance externe. C'est la méthode recommandée.

API native crypto.randomUUID() (recommandée)

// Navigateur (Chrome 92+, Firefox 95+, Safari 15.4+, Edge 92+)
const id = crypto.randomUUID();
console.log(id); // → "f47ac10b-58cc-4372-a567-0e02b2c3d479"

// Node.js 14.17+
const { randomUUID } = require('crypto');
const id = randomUUID();

// Node.js ESM
import { randomUUID } from 'crypto';
const id = randomUUID();

// Vérification du support
const uuid = typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
    ? crypto.randomUUID()
    : fallbackUUID(); // implémentation manuelle

Librairie uuid (npm) — support v1, v3, v4, v5, v7

// Installation
npm install uuid

// Utilisation (ESM)
import { v4 as uuidv4, v7 as uuidv7 } from 'uuid';

const idV4 = uuidv4();
// → "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

const idV7 = uuidv7();
// → "01861f34-3a2b-7000-8000-000000000001" (trié chronologiquement)

// UUID v5 — déterministe à partir d'un namespace + nom
import { v5 as uuidv5 } from 'uuid';
const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341';
const id = uuidv5('mon-slug-article', MY_NAMESPACE);
// → Toujours le même pour ce couple (namespace, nom)

Génération en masse avec Array.from

// Générer 10 UUIDs v4 en une ligne
const uuids = Array.from({ length: 10 }, () => crypto.randomUUID());

// Avec map sur un tableau existant (ajouter un ID à des objets)
const users = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];
const usersWithId = users.map(u => ({ ...u, id: crypto.randomUUID() }));

// Insérer en base (exemple Prisma / PostgreSQL)
await prisma.user.createMany({
    data: usersWithId,
    skipDuplicates: true,
});

Validation d'un UUID côté client

// Regex de validation UUID (v1 à v5, ou v7)
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

function isValidUUID(str) {
    return UUID_REGEX.test(str);
}

isValidUUID('550e8400-e29b-41d4-a716-446655440000'); // → true
isValidUUID('not-a-uuid');                           // → false
isValidUUID('550e8400-e29b-91d4-a716-446655440000'); // → false (version 9 invalide)

UUIDs dans les bases de données : bonnes pratiques

Stocker des UUIDs en base de données demande quelques précautions pour éviter les problèmes de performance. Le choix du type de colonne et de la version UUID a un impact direct sur la vitesse des index.

PostgreSQL — type UUID natif

-- PostgreSQL supporte le type UUID nativement (16 octets, compact)
CREATE TABLE users (
    id   UUID         PRIMARY KEY DEFAULT gen_random_uuid(),  -- UUID v4
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL
);

-- Insertion avec UUID généré côté client (JavaScript / backend)
INSERT INTO users (id, name, email)
VALUES ('550e8400-e29b-41d4-a716-446655440000', 'Alice', 'alice@example.com');

-- Requête par UUID
SELECT * FROM users WHERE id = '550e8400-e29b-41d4-a716-446655440000';

-- Extension pgcrypto pour plus d'options
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
SELECT gen_random_uuid(); -- UUID v4

MySQL — CHAR(36) vs BINARY(16)

-- Option 1 : CHAR(36) — lisible mais 36 octets
CREATE TABLE orders (
    id    CHAR(36)     PRIMARY KEY,
    total DECIMAL(10,2)
);

-- Option 2 : BINARY(16) — compact et performant (recommandé)
CREATE TABLE orders (
    id    BINARY(16)   PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID(), 1)),
    total DECIMAL(10,2)
);
-- Le 2ème arg de UUID_TO_BIN = 1 → réordonne pour être chronologique

-- Requête lisible
SELECT BIN_TO_UUID(id, 1) AS id, total FROM orders;

-- PHP : générer et stocker
$uuid = Ramsey\Uuid\Uuid::uuid4()->toString();
$stmt->bindValue(':id', hex2bin(str_replace('-', '', $uuid)));

MongoDB — ObjectId vs UUID

// MongoDB utilise ObjectId par défaut (12 octets, timestamp + machine + PID + compteur)
// Pour imposer des UUIDs v4 :
const { MongoClient, UUID } = require('mongodb');

const doc = {
    _id: new UUID('550e8400-e29b-41d4-a716-446655440000'),
    name: 'Product Alpha',
};
await collection.insertOne(doc);

// Requête
const result = await collection.findOne({ _id: new UUID(id) });

Problème de fragmentation avec UUID v4 — et la solution UUID v7

UUID v4 est entièrement aléatoire. Chaque insertion dans un index BTree (PRIMARY KEY) atterrit à une position aléatoire, provoquant des page splits fréquents et une fragmentation progressive. Avec des tables de plusieurs millions de lignes, les performances d'insertion peuvent chuter de 30 à 50%.

  • UUID v7 : timestamp en tête → insertions séquentielles → pas de fragmentation
  • ULID : alternative populaire (26 chars Base32, tri chronologique natif)
  • Snowflake ID (Twitter) : 64 bits, timestamp + datacenter + séquence
  • CUID2 : collision-resistant, ordonné, URL-safe, ~24 chars

Générer des UUIDs en PHP, Python, Java et Go

PHP — ramsey/uuid ou uuid natif

<?php
// PHP 8.1+ — pas de UUID natif, mais ramsey/uuid est la référence
// composer require ramsey/uuid

use Ramsey\Uuid\Uuid;

$v4 = Uuid::uuid4()->toString();
// → "110e8400-e29b-41d4-a716-446655440000"

$v7 = Uuid::uuid7()->toString();
// → "01861f34-3a2b-7000-8000-000000000001"

// UUID v5 — déterministe
$v5 = Uuid::uuid5(Uuid::NAMESPACE_DNS, 'example.com')->toString();

// Sans dépendance — UUID v4 manuel (PHP pur)
function uuid4(): string {
    $data = random_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // version 4
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // variant
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
?>

Python — module uuid standard

import uuid

# UUID v4 — aléatoire
uid4 = uuid.uuid4()
print(uid4)              # → 550e8400-e29b-41d4-a716-446655440000
print(str(uid4))         # → string avec tirets
print(uid4.hex)          # → sans tirets
print(uid4.bytes)        # → bytes bruts (16 octets)

# UUID v5 — déterministe (SHA-1)
uid5 = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')

# UUID v1 — horodaté
uid1 = uuid.uuid1()
print(uid1.time)         # → timestamp Unix en 100ns

# Valider un UUID
def is_valid_uuid(val):
    try:
        uuid.UUID(str(val))
        return True
    except ValueError:
        return False

Java — java.util.UUID

import java.util.UUID;

// UUID v4 — nativement supporté
UUID uid = UUID.randomUUID();
System.out.println(uid);              // → 550e8400-e29b-41d4-a716-446655440000
System.out.println(uid.toString());   // → même chose
System.out.println(uid.getMostSignificantBits());  // long
System.out.println(uid.getLeastSignificantBits()); // long

// Depuis une string
UUID parsed = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");

// Pour UUID v7 en Java : utiliser la lib com.fasterxml.uuid
// org.javastruct:java-uuid-generator:5.0.0

Go — package uuid (google/uuid)

// go get github.com/google/uuid
package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    // UUID v4
    id := uuid.New()
    fmt.Println(id.String()) // → "550e8400-e29b-41d4-a716-446655440000"

    // UUID v7
    id7, _ := uuid.NewV7()
    fmt.Println(id7.String())

    // Valider
    _, err := uuid.Parse("not-a-uuid")
    fmt.Println(err != nil) // → true

    // Depuis string
    id2, _ := uuid.Parse("550e8400-e29b-41d4-a716-446655440000")
    fmt.Println(id2.Version()) // → 4
}

UUIDs et sécurité : ce qu'il faut savoir

UUID v4 est-il cryptographiquement sûr ?

Cela dépend de la source d'aléatoire. crypto.randomUUID() et crypto.getRandomValues() utilisent le CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) du système d'exploitation — le même que /dev/urandom sous Linux. Ils sont sûrs pour des tokens de session, des liens de reset de mot de passe, etc.

⚠️ Ne jamais utiliser Math.random() pour générer des UUIDs. Math.random() n'est pas cryptographiquement sûr et peut être prédictible dans certains moteurs JS. Toujours utiliser crypto.getRandomValues() ou crypto.randomUUID().

Prévention des attaques IDOR avec les UUIDs

Les IDs auto-incrémentés exposent les ressources à des attaques IDOR (Insecure Direct Object Reference) : un attaquant peut énumérer /api/orders/1, /api/orders/2… Les UUID v4 rendent cette énumération impossible (2¹²² combinaisons).

// ❌ Vulnérable à l'IDOR — endpoint prévisible
GET /api/orders/42      → order de l'utilisateur 42
GET /api/orders/43      → order de l'utilisateur 43 (accessible ?)

// ✅ Avec UUID v4 — énumération impossible
GET /api/orders/550e8400-e29b-41d4-a716-446655440000
// Contrôle d'accès obligatoire côté serveur malgré tout !

UUID v1 — risques de vie privée

L'UUID v1 encode l'adresse MAC de la machine. Plusieurs incidents ont permis de retrouver l'identité de créateurs de documents Word ou de messages Skype via leur UUID v1. Pour les données sensibles, préférez toujours UUID v4.

  • Logs publics : utiliser UUID v4, jamais v1
  • Tokens de réinitialisation : UUID v4 via crypto.randomUUID()
  • Clés primaires BDD exposées en API : UUID v4 ou v7
  • Fichiers partagés : UUID v4 comme nom de fichier

Questions fréquentes sur les UUIDs

UUID et GUID, c'est la même chose ?

Oui, techniquement. UUID est le terme de la RFC 4122 (IETF), GUID est le terme Microsoft (Windows, .NET, SQL Server, COM). Ils utilisent le même format 128 bits et sont interchangeables. La seule nuance : les GUIDs Microsoft sont parfois écrits avec des accolades — {550e8400-e29b-41d4-a716-446655440000}.

Peut-on avoir des collisions UUID v4 ?

Théoriquement oui, pratiquement non. Pour avoir 50% de chance de collision, il faudrait générer 2,71 × 10¹⁸ UUIDs. À raison d'un milliard d'UUIDs par seconde, cela prendrait 85 ans. Les bases de données modernes ont de toute façon une contrainte UNIQUE qui détecterait un éventuel doublon.

Comment stocker les UUIDs efficacement en MySQL ?

Utilisez BINARY(16) avec UUID_TO_BIN(uuid, 1) pour réordonner les bits de manière chronologique (UUID v1) ou utilisez UUID v7 directement. Évitez VARCHAR(36) pour les clés primaires : 2,25× plus volumineux et index moins performants.

Quelle est la différence entre UUID v4 et ULID ?

ULID (Universally Unique Lexicographically Sortable Identifier) est une alternative à UUID v4 : 26 caractères Base32 Crockford, tri chronologique natif, insensible à la casse. Il combine les avantages de l'ordre chronologique (UUID v7) et d'une représentation plus compacte. Exemple ULID : 01ARZ3NDEKTSV4RRFFQ69G5FAV.

Comment valider un UUID en PHP ?

<?php
// Regex de validation RFC 4122
function isValidUuid(string $uuid): bool {
    return (bool) preg_match(
        '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i',
        $uuid
    );
}

var_dump(isValidUuid('550e8400-e29b-41d4-a716-446655440000')); // bool(true)
var_dump(isValidUuid('not-a-uuid'));                           // bool(false)
?>

Cet outil génère-t-il des UUIDs côté serveur ?

Non. Tout se passe dans votre navigateur via l'API crypto.randomUUID() (ou crypto.getRandomValues() en fallback). Aucune donnée n'est envoyée à un serveur. Les UUIDs générés sont cryptographiquement sécurisés et directement utilisables en production.

Comment utiliser un UUID comme nom de fichier lors d'un upload ?

// JavaScript (côté client — avant upload)
const file = event.target.files[0];
const ext  = file.name.split('.').pop();
const safeName = crypto.randomUUID() + '.' + ext;
// → "550e8400-e29b-41d4-a716-446655440000.jpg"

// PHP (côté serveur)
$ext  = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    mt_rand(0, 0xffff),
    mt_rand(0, 0x0fff) | 0x4000,
    mt_rand(0, 0x3fff) | 0x8000,
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
$filename = $uuid . '.' . strtolower($ext);
move_uploaded_file($_FILES['file']['tmp_name'], '/uploads/' . $filename);

Conclusion

Les UUIDs sont devenus incontournables dans le développement moderne : APIs REST, microservices, bases de données distribuées, tokens de sécurité. Le choix de la version dépend du cas d'usage : UUID v4 pour la majorité des cas (tokens, IDs API), UUID v7 pour les clés primaires BDD (performance d'index), UUID v5 pour des IDs déterministes depuis des données métier.

Notre générateur fonctionne entièrement dans votre navigateur via crypto.randomUUID() — sans envoi de données, sans serveur, cryptographiquement sécurisé. Générez en masse, choisissez votre format et copiez en un clic.

Partager