Создание GUID в Java

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

Ответ 1

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

Например:

  • Если вам нужен случайный UUID, вы можете использовать метод randomUUID.
  • Если вы хотите, чтобы UUID был инициализирован определенным значением, вы можете использовать конструктор UAID или fromString.

Ответ 2

java.util.UUID.randomUUID();

Ответ 3

Это зависит от того, какой тип UUID вы хотите.

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

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

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

Ответ 4

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

import java.util.UUID;

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

Ответ 5

Другие ответы верны, особенно этот Stephen C.

Достижение внешней 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 Generator создает версии 1 и 3, а также значения nil и GUID.

Ответ 6

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