UUID în Java

Identificator unic de 128 de biți (ex. 3f2b8c1e-…); UUID.randomUUID() creează unul aleatoriu, practic imposibil de repetat.

Sintaxă
import java.util.UUID;

static UUID randomUUID()
static UUID nameUUIDFromBytes(byte[] nume)
String toString()
int version()

Ce face UUID

Un UUID (Universally Unique Identifier) este un număr de 128 de biți scris ca 36 de caractere: 32 de cifre hexazecimale în grupe de 8-4-4-4-12, despărțite prin cratime. Se folosește ca cheie pentru comenzi, fișiere încărcate sau sesiuni, când nu vrei un contor central.

UUID.randomUUID() creează un UUID de versiunea 4, din 122 de biți aleatorii generați cu SecureRandom. Șansa ca două să fie egale este atât de mică încât în practică nu se întâmplă. Rezultatul diferă la fiecare apel.

UUID.nameUUIDFromBytes(octeti) creează un UUID de versiunea 3, calculat din octeții primiți: același text dă mereu același UUID. version() spune versiunea, iar toString() dă forma cu cratime, cu litere mici.

Parametri

Parametru Descriere
nume Pentru nameUUIDFromBytes: octeții din care se calculează UUID-ul.

Ce returnează

Un obiect UUID imutabil.

Exemple

Exemplul 1: Un cod unic pentru fiecare comandă

Valorile diferă la fiecare rulare.

import java.util.UUID;

public class Main {
    public static void main(String[] args) {
        for (String client : new String[] {"Ana", "Mihai"}) {
            UUID cod = UUID.randomUUID();
            System.out.println("Comanda lui " + client + ": " + cod);
        }
    }
}

Rezultat posibil (diferă la fiecare rulare)

Comanda lui Ana: 3f2b8c1e-9a47-4d0b-b6e2-71c5d8a90f14
Comanda lui Mihai: c0a81f52-0e3d-4b9a-8f61-2d7e4c19ab03

Exemplul 2: Ce este mereu la fel la un UUID aleatoriu

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

public class Main {
    public static void main(String[] args) {
        UUID u = UUID.randomUUID();
        String text = u.toString();
        System.out.println("Lungime: " + text.length());
        System.out.println("Versiune: " + u.version());
        System.out.println("Cratime pe pozițiile 8, 13, 18, 23: "
            + (text.charAt(8) == '-' && text.charAt(13) == '-' && text.charAt(18) == '-' && text.charAt(23) == '-'));
        Set<UUID> multe = new HashSet<>();
        for (int i = 0; i < 100_000; i++) multe.add(UUID.randomUUID());
        System.out.println("UUID-uri diferite din 100000: " + multe.size());
    }
}

Rezultat

Lungime: 36
Versiune: 4
Cratime pe pozițiile 8, 13, 18, 23: true
UUID-uri diferite din 100000: 100000

Exemplul 3: UUID calculat dintr-un nume (mereu același)

import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class Main {
    public static void main(String[] args) {
        UUID a = UUID.nameUUIDFromBytes("ana@exemplu.ro".getBytes(StandardCharsets.UTF_8));
        UUID b = UUID.nameUUIDFromBytes("ana@exemplu.ro".getBytes(StandardCharsets.UTF_8));
        System.out.println(a + " (versiunea " + a.version() + ")");
        System.out.println("Același UUID: " + a.equals(b));
    }
}

Rezultat

99752505-5e47-3d75-adba-bd5b7cbcee22 (versiunea 3)
Același UUID: true

Greșeli frecvente

  • Compari UUID-uri cu ==. Compară obiectele, nu valorile; folosește equals.
  • Folosești un UUID aleatoriu ca parolă sau ca singura protecție a unui link secret, fără altă verificare. Este greu de ghicit, dar nu înlocuiește autentificarea.
  • Salvezi UUID-ul ca text cu litere mari și apoi compari ca text cu toString(), care dă litere mici. Compară obiectele UUID.

Comenzi înrudite

  • UUID.fromString: Transformă un text de forma 8-4-4-4-12 cifre hexazecimale într-un obiect UUID; aruncă IllegalArgumentException dacă nu este valid.
  • Random: Generator de numere pseudo-aleatorii; nextInt(n) dă un întreg între 0 și n-1. Cu o sămânță fixă, șirul se repetă.
  • String.equals: Verifică dacă două șiruri au exact același text; equalsIgnoreCase și equalsFoldCase ignoră literele mari/mici.