Создание GUID в Java

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

6 ответов


посмотреть класс UUID в комплекте с Java 5 и выше.

например:

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

java.util.UUID.randomUUID();


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

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

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

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


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

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 );
    }
}

другие ответы верны, особенно этот by Стивен C.

Выход За Пределы Java

создание UUID значение в Java ограничено версия 4 (random) из-за соображений безопасности.

если вы хотите другие версии UUIDs, один из путей должен иметь ваше Java-приложение за пределами JVM для создания UUID путем вызова on:

  • утилита командной строки
    в комплекте почти со всеми операционными системами.
    например, uuidgen найдено в Mac OS X, BSD и Linux.
  • сервер базы данных
    использовать JDBC для получения UUID, созданного на сервере базы данных.
    например,uuid-ossp

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