Tworzenie GUID w Javie

Jakie są najlepsze sposoby tworzenia GUID w Javie?

 297
Author: Boann, 2010-06-06

6 answers

Spójrz na klasę UUID dołączoną do Javy 5 i późniejszych.

Na przykład:

  • Jeśli chcesz mieć losowy UUID, możesz użyć metody randomUUID .
  • jeśli chcesz, aby UUID został zainicjowany do określonej wartości, możesz użyć konstruktora uuid lub metody fromString.
 281
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 21:11:10

java.util.UUID.randomUUID();

 341
Author: Kaleb Brasee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-06 01:16:03

To zależy jakiego rodzaju UUID chcesz.

Aby uzyskać więcej informacji na temat typów i wariantów UUID, istnieje dobre podsumowanie w Wikipedia, a krwawe szczegóły są w RFC 4122 i innych specyfikacjach.

 29
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 22:56:00

Wystarczy rozszerzyć odpowiedź Marka Byersa o Przykład:

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 );
    }
}
 12
Author: Anton Belev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-10 09:37:37

Inne odpowiedzi są poprawne, szczególnie TA autorstwa Stephena C .

Sięganie Poza Javę

Generowanie wartości UUID w Javie jest ograniczone do W wersji 4 (random) ze względu na problemy z bezpieczeństwem.

Jeśli chcesz mieć inne wersje uuid, jedną z opcji jest to, aby Twoja aplikacja Java sięgała poza JVM , aby wygenerować uuid poprzez wywołanie:

  • narzędzie wiersza poleceń
    W zestawie z prawie każdym system operacyjny.
    na przykład, uuidgen Znalezione w Mac OS X, BSD i Linux.
  • serwer bazy danych
    użyj JDBC, Aby pobrać UUID wygenerowany na serwerze bazy danych.
    na przykład uuid-ossp rozszerzenie często w pakiecie z Postgres . Rozszerzenie to może generować wartości wersji 1, 3 i 4 oraz dodatkowo kilka wariantów:
    • {–2]} - generuje uuid wersji 1, ale używa losowego adresu MAC multicastu zamiast prawdziwy adres MAC komputera.
    • {–3]} - generuje UUID w wersji 5, który działa jak uuid w wersji 3 z tą różnicą, że SHA-1 jest używany jako metoda mieszania.
  • serwis WWW
    na przykład, uuid Generator tworzy wersje 1 i 3, a także zero wartości I GUID .
 6
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:20

Możesz użyć tego kodu do wygenerowania 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
Author: user2044181,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 16:17:18