Crea un GUID in Java


Risposte:


348

Dai un'occhiata alla classe UUID in bundle con Java 5 e versioni successive.

Per esempio:

  • Se si desidera un UUID casuale, è possibile utilizzare il metodo randomUUID .
  • Se si desidera inizializzare un UUID su un valore specifico, è possibile utilizzare il costruttore UUID o il metodo fromString .

7
Se includi un esempio come ha fatto Kaleb Brasee, la tua buona risposta sarebbe ancora migliore.
Zero3,

Funziona in AndroidStudio 2.3 e almeno sui livelli API 21 e oltre. Forse anche più indietro.
Raddevus,

6
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger

420

java.util.UUID.randomUUID();


2
potrebbe tornare ripetere? perché Guid non ripeterà mai
angelo

4
@angel Sì, teoricamente è possibile che il UUID.randomUUIDmetodo restituisca un duplicato, ma questo non è affatto un problema realistico . L'implementazione Oracle / OpenJDK utilizza un generatore di numeri casuali crittograficamente forte. Detto questo, e data la portata astronomica data da così tanti bit in un UUID, puoi generare molti milioni di tali valori nella tua app e dormire ancora bene. L'uso di una delle altre varianti riduce ulteriormente la possibilità di collisioni ancora più vicine allo zero a causa dell'utilizzo di "spazio e tempo", [1] indirizzo MAC o nome e [2] data-ora corrente, come vincoli.
Basil Bourque,

@RenniePet Eh, se sei così paranoico e hai accesso all'elenco degli ID già usati quando ne crei uno nuovo, devi semplicemente generarne di nuovi in ​​a whilefino a quando non ne hai uno che non è all'interno del tuo elenco: p
Nyerguds,

2
Il generatore di numeri casuali crittografici Oracle è in genere un PRNG con un seme casuale. Il seme casuale viene in genere ottenuto utilizzando una fonte di "entropia" fornita dal sistema operativo. Se puoi degradare o compromettere quella fonte, aumenta la probabilità che un generatore di numeri crittografici casuali produca lo stesso numero. Vale anche la pena notare che su alcune piattaforme (ad esempio virtualizzate), il sistema operativo può esaurire l'entropia. Ci sono "trucchi ingannevoli" per aggirare questo problema, ma comportano un degrado della qualità dell'entropia.
Stephen C

Questa non è solo una preoccupazione accademica. Ho visto un'affermazione ( non verificata !! ) che qualcuno ha riscontrato problemi con UUID basati su casuale che non sono unici.
Stephen C,

32

Dipende dal tipo di UUID che desideri.

  • La UUIDclasse Java standard genera UUID versione 4 (casuali). ( UPDATE - UUID versione 3 (nome) possono anche essere generati.) Può anche gestire altre varianti, sebbene non possa generarle. (In questo caso, "handle" significa costruire UUIDistanze da long, byte[]o Stringrappresentazioni, e fornire alcuni accessori appropriati.)

  • L' implementazione di Java UUID Generator (JUG) pretende di supportare "tutti e 3 i tipi" UUID "ufficiali come definiti da RFC-4122 " ... sebbene l'RFC in realtà definisca 4 tipi e menzioni un 5 ° tipo.

Per ulteriori informazioni sui tipi e le varianti UUID, c'è un buon riassunto in Wikipedia , e i dettagli gory sono in RFC 4122 e le altre specifiche.


1
Non del tutto vero, può anche generare UUID basati sul nome (versione 3) conUUID.nameUUIDFromBytes(byte[] name)
DennisK

Sono corretto. Ho fatto affidamento sulla descrizione javadoc che dice "Fabbrica statica per recuperare un UUID di tipo 3 (basato sul nome) basato sull'array di byte specificato."
Stephen C

Non penso che il post sia accurato. I documenti UUID Java indicano che il costruttore genera una variante di tipo 2, non casuale. Per l'uso di tipo 3 public static UUID nameUUIDFromBytes(byte[] name). per uso di tipo 4 public static UUID randomUUID(). Il tipo 1 non è disponibile con la classe JDK.
slartibartfast,

No. Penso di aver capito bene. Lo stato javadocs: "sebbene i costruttori consentano la creazione di qualsiasi variante di UUID (descritta di seguito)." e 4 varianti sono elencate di seguito, incluso il tipo 1. In effetti, leggi il javadoc perclockSequence()
Stephen C

27

Giusto per estendere la risposta di Mark Byers con un esempio:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

Le altre risposte sono corrette, soprattutto questo uno da Stephen C .

Raggiungere al di fuori di Java

La generazione di un valore UUID in Java è limitata alla versione 4 (casuale) a causa di problemi di sicurezza.

Se desideri altre versioni di UUID, una strada è avere la tua app Java fuori dalla JVM per generare UUID chiamando:

  • Utilità da riga di comando In
    bundle con quasi tutti i sistemi operativi.
    Ad esempio, si uuidgentrova in Mac OS X, BSD e Linux.
  • Server database
    Utilizzare JDBC per recuperare un UUID generato sul server database.
    Ad esempio, l' uuid-osspestensione è spesso inclusa in Postgres . Tale estensione può generare i valori delle versioni 1, 3 e 4 e inoltre un paio di varianti:
    • uuid_generate_v1mc() - genera un UUID versione 1 ma utilizza un indirizzo MAC multicast casuale anziché l'indirizzo MAC reale del computer.
    • uuid_generate_v5(namespace uuid, name text) - genera un UUID versione 5, che funziona come un UUID versione 3, tranne che SHA-1 viene utilizzato come metodo di hashing.
  • Servizio Web
    Ad esempio, UUID Generator crea versioni 1 e 3 nonché valori nulli e GUID .

3
Ho alcuni problemi con la tua risposta: in primo luogo, è già stato dimostrato che è possibile ottenere V4 solo dalla libreria Java standard (V3 è anche possibile). In secondo luogo, fai sembrare che non ci siano opzioni all'interno di Java oltre alla libreria standard, insieme a un mosso "a causa di problemi di sicurezza". Infine, è generalmente inefficiente (in termini di programmazione e / o prestazioni) iniziare a seconda delle fonti esterne quando ci sono molti modi per farlo all'interno di Java (a meno che non sia necessario in quelli, ovviamente, ad esempio come parte della creazione di un registrare nel server SQL).
DennisK,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.