Создать GUID в Java - PullRequest
       11

Создать GUID в Java

337 голосов
/ 06 июня 2010

Каковы некоторые из лучших способов создания GUID в Java?

Ответы [ 6 ]

379 голосов
/ 06 июня 2010

java.util.UUID.randomUUID();

310 голосов
/ 06 июня 2010

Взгляните на UUID класс в комплекте с Java 5 и более поздними версиями.

Например:

  • Если вам нужен случайный UUID, вы можете использовать метод randomUUID .
  • Если вы хотите, чтобы UUID инициализировался определенным значением, вы можете использовать конструктор UUID или fromString метод.
31 голосов
/ 06 июня 2010

Зависит от того, какой UUID вы хотите.

  • Стандартный класс Java UUID генерирует Версия 4 (случайные) UUID. ( ОБНОВЛЕНИЕ - Версия 3 (имя) UUID также могут быть сгенерированы.) Он также может обрабатывать другие варианты, хотя и не может их генерировать. (В этом случае «дескриптор» означает создание UUID экземпляров из long, byte[] или String представлений и предоставление некоторых соответствующих аксессоры.)

  • Реализация Java UUID Generator (JUG) подразумевает поддержку «всех 3« официальных »типов UUID в соответствии с RFC-4122 " ... хотя RFC фактически определяет 4 типа и упоминает 5-й тип.

Дополнительную информацию о типах и вариантах UUID можно найти в Wikipedia , а подробности в RFC 4122 и других спецификациях.

17 голосов
/ 10 октября 2016

Просто чтобы расширить ответ Марка Байерса на примере:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + randomUUIDString.toString() );
    }
}
6 голосов
/ 17 июля 2015

Остальные ответы верны, особенно этот Стивен С .

Выход за пределы Java

Создание значения UUID в Java ограничено Версия 4 (произвольная) из-за проблем безопасности.

Если вы хотите, чтобы другие версии UUID были доступны, ваше приложение Java должно выходить за пределы JVM , чтобы генерировать UUID, вызывая:

  • Утилита командной строки
    Поставляется практически с каждой операционной системой.
    Например, uuidgen в Mac OS X, BSD и Linux .
  • Сервер базы данных
    Используйте JDBC для получения UUID, сгенерированного на сервере базы данных.
    Например, uuid-ossp расширение часто в комплекте с Postgres . Это расширение может генерировать значения версий 1, 3 и 4, а также пару вариантов:
    • uuid_generate_v1mc() - генерирует UUID версии 1, но использует случайный MAC-адрес многоадресной рассылки вместо реального MAC-адреса компьютера.
    • uuid_generate_v5(namespace uuid, name text) - генерирует UUID версии 5, который работает как UUID версии 3, за исключением того, что SHA-1 используется в качестве метода хеширования.
  • Веб-служба
    Например, Генератор UUID создает версии 1 и 3, а также нулевые значения и GUID .
0 голосов
/ 27 ноября 2017

Вы можете использовать этот код для генерации 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);
    }
}
...