Cos'è UUID/GUID?
UUID (Universally Unique Identifier) e GUID (Globally Unique Identifier) sono termini intercambiabili per identificatori unici a 128 bit. Creati per generare ID univoci senza richiedere coordinamento centrale, sono ampiamente utilizzati in database, API REST e sistemi distribuiti.
Versioni UUID
UUID v4 - Casuale (Consigliato)
Generato casualmente utilizzando crittografia forte. Probabilità di collisione: ~1 su 2¹²² (trilioni di trilioni). Ideale per la maggior parte dei casi: chiavi primarie, token di sessione, identificatori di risorse.
Esempio: 550e8400-e29b-41d4-a716-446655440000
UUID v1 - Basato su Timestamp
Include timestamp (60 bit) + indirizzo MAC del computer (48 bit) + contatore. Vantaggio: ordinabile cronologicamente. Svantaggio: rivela informazioni di sistema (indirizzo MAC, ora di creazione).
Esempio: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Altre Versioni (v3, v5, v6, v7)
v3/v5: Generati da hash (MD5/SHA-1) di un namespace + nome. Deterministici (stesso input = stesso UUID). v6/v7: Proposte recenti che combinano timestamp ordinabile con casualità sicura.
Esempio:
Casi d'uso comuni
🗄️ Chiavi Primarie di Database
Sostituisci auto-increment con UUID per facilitare la fusione dei dati tra ambienti (dev, staging, prod) e sharding orizzontale. MongoDB, PostgreSQL e MySQL lo supportano nativamente.
🔗 URL di Risorse REST
/api/users/550e8400-e29b-41d4-a716-446655440000
Gli UUID negli URL prevengono attacchi di enumerazione e mantengono gli URL imprevedibili.
🎫 Token di Sessione e Autenticazione
Token OAuth, session ID, reset token. Gli UUID sono crittograficamente sicuri e impossibili da indovinare (a differenza delle sequenze numeriche).
📦 Identificatori di Eventi/Messaggi
Tracciamento di eventi in microservizi, code di messaggi (RabbitMQ, Kafka), log distribuiti. Correlation ID tra servizi.
📁 Nomi di File Unici
Caricamenti di immagini, backup, file temporanei. Previene conflitti e consente caricamenti simultanei senza blocco.
UUID vs Auto-increment: Pro e Contro
| Caratteristica | UUID | Auto-increment (INT) |
|---|---|---|
| Dimensione | 16 byte (128 bit) | 4 byte (32 bit) o 8 byte (64 bit) |
| Generazione distribuita | ✓ Sì, senza coordinamento | ✗ Richiede controllo centrale |
| Prevedibilità | Imprevedibile (sicuro) | Prevedibile (rischio di enumerazione) |
| Prestazioni indice | Più lento (128 bit casuali) | Più veloce (sequenziale, cache-friendly) |
| Ordinamento cronologico | No (v4), Sì (v1, v6, v7) | Sì (sequenziale) |
| Fusione database | ✓ Banale (nessuna collisione) | ✗ Complesso (conflitti ID) |
| Ideale per | Sistemi distribuiti, API, sicurezza | Sistemi monolitici, prestazioni critiche |
Come usare UUID in diversi linguaggi
JavaScript/Node.js
// Nativo (Node.js 14.17+)
import { randomUUID } from 'crypto';
const uuid = randomUUID();
// Con libreria 'uuid'
import { v4 as uuidv4 } from 'uuid';
const uuid = uuidv4();Python
import uuid # UUID v4 uuid_v4 = uuid.uuid4() print(uuid_v4) # 550e8400-e29b-41d4-a716-446655440000 # UUID v1 uuid_v1 = uuid.uuid1() print(uuid_v1) # 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Java
import java.util.UUID; // UUID casuale UUID uuid = UUID.randomUUID(); System.out.println(uuid.toString());
PostgreSQL
-- Abilitare estensione CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Generare UUID SELECT uuid_generate_v4(); -- Creare tabella con UUID CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(100) );
FAQ - Domande Frequenti
1. Gli UUID sono davvero unici? Possono esserci collisioni?
Gli UUID v4 hanno 2¹²² combinazioni possibili. La probabilità di collisione è astronomicamente bassa (1 su 5 miliardi dopo aver generato 1 miliardo di UUID). Per scopi pratici, considerali unici. I database moderni rilevano le collisioni tramite vincoli UNIQUE.
2. UUID v1 è sicuro? Posso usarlo in produzione?
UUID v1 rivela il timestamp di creazione e l'indirizzo MAC della macchina, considerato perdita di informazioni. Non usare per token di sicurezza o in contesti in cui la privacy è critica. Preferire v4 per sicurezza, o v6/v7 se serve ordinamento cronologico senza esporre l'indirizzo MAC.
3. UUID impatta le prestazioni del database?
Sì, ma generalmente accettabile. Gli UUID casuali causano frammentazione dell'indice B-tree (non sono sequenziali). Per PostgreSQL, usa UUID v7 o ULID (Universally Unique Lexicographically Sortable Identifier). Per casi estremi di prestazioni (miliardi di record), mantieni auto-increment.
4. Devo usare i trattini o rimuoverli?
Dipende dal contesto. Con trattini (standard RFC 4122): più leggibile, compatibile con librerie standard. Senza trattini: risparmia 4 byte in memorizzazione di stringhe, utile per URL brevi o token. PostgreSQL memorizza in binario (16 byte) indipendentemente dalla formattazione.
5. Posso usare UUID come abbreviatore di URL?
Tecnicamente sì, ma inefficiente. Gli UUID hanno 36 caratteri (con trattini) o 32 senza. Per abbreviatori di URL, usa codifiche più brevi: base62 (A-Za-z0-9) genera ID di 6-8 caratteri, sufficienti per miliardi di URL.
6. UUID funziona in sistemi offline?
Sì! È uno dei principali vantaggi. I client offline (app mobili, IoT) generano UUID localmente senza connessione al server. Quando sincronizzano, non ci sono conflitti di ID. Ideale per CRDT e sincronizzazione multi-dispositivo.