Domanda Creare un GUID in Java


Quali sono alcuni dei modi migliori per creare un GUID in Java?


288
2018-06-06 01:12


origine


risposte:


Dai un'occhiata al Classe UUID in bundle con Java 5 e versioni successive.

Per esempio:

  • Se vuoi un UUID casuale puoi usare il randomUUID metodo.
  • Se si desidera che un UUID sia inizializzato su un valore specifico, è possibile utilizzare Costruttore UUID o il fromstring metodo.

270
2018-06-06 01:14



java.util.UUID.randomUUID();


329
2018-06-06 01:16



Dipende da che tipo di UUID tu vuoi.

  • Lo standard Java UUID classe genera Versione 4 UUID (casuali). (AGGIORNARE - Versione 3 (nome) È anche possibile generare UUID.) Può anche gestire altre varianti, sebbene non possa generarle. (In questo caso, "handle" significa costrutto UUID istanze da long, byte[] o String rappresentazioni e fornire alcuni strumenti di accesso appropriati).

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

Per maggiori informazioni su tipi e varianti UUID, c'è un buon sommario in Wikipediae i dettagli cruenti sono in RFC 4122 e le altre specifiche.


29
2018-06-06 03:28



Solo 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();
        String randomUUIDString = uuid.toString();
        System.out.println("UUID=" + randomUUIDString );
    }
}

11
2017-10-10 09:37



Le altre risposte sono corrette, specialmente questo di Stephen C.

Raggiungere fuori da Java

Generazione di un UUID il valore all'interno di Java è limitato a Versione 4 (casuale) a causa di problemi di sicurezza.

Se vuoi altre versioni di UUID, una via deve avere la tua app Java fuori dal JVM generare UUID chiamando su:

  • Utilità della riga di comando
    In bundle con quasi tutti i sistemi operativi.
     Per esempio, uuidgen trovato in Mac OS X, BSD e Linux.
  • Server di database
    Uso JDBC per recuperare un UUID generato sul server del database.
    Ad esempio, il uuid-ossp estensione spesso in bundle con Postgres. Tale estensione può generare valori di 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 per il fatto che SHA-1 viene utilizzato come metodo di hashing.
  • Servizio web
    Per esempio, Generatore UUID crea le versioni 1 e 3 e valori nulli e GUID.

6
2017-07-16 21:38



È possibile utilizzare questo codice per generare GUID.

 import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;

public class StrictMicroSecondTimeBasedGuid
{
    private final static Logger logger = Logger
            .getLogger(StrictMicroSecondTimeBasedGuid.class);

    private static final long MICRO_IN_MILL = 1000;
    private static final long NANO_IN_MICRO = 1000;

    private static long baseNanoTime;
    private static long baseTimeInMicro;
    private static long lastGuid;

    static
    {
        /*
         * Nanosecond time's reference is not known, therfore following logic is
         * needed to calculate time in micro without knowing refrence point of
         * nano time*
         */
        baseNanoTime = System.nanoTime();
        baseTimeInMicro = System.currentTimeMillis() * MICRO_IN_MILL;
        lastGuid = baseTimeInMicro;
    }

    public static synchronized Long newGuid()
    {
        long newGuid;

        while ((newGuid = calNewTimeInMicro()) <= lastGuid)
        {
            /** we have to check for this log, we don't want to see log. */

            logger.debug("wait of 10-microsecond is introduced to get new guid");

            try
            {
                TimeUnit.MICROSECONDS.sleep(10);
            } catch (InterruptedException e)
            {
                logger.error("Error", e);
            }
        }

        lastGuid = newGuid;
        return newGuid;
    }

    private static long calNewTimeInMicro()
    {
        return baseTimeInMicro
                + ((System.nanoTime() - baseNanoTime) / NANO_IN_MICRO);
    }
}

-2
2017-11-27 15:48