Генерация уникального идентификатора с использованием UUID действительно уникальна? - PullRequest
10 голосов
/ 20 апреля 2011

Я хочу генерировать уникальный идентификатор так же, как автоматическое увеличение в Java. Итак, ранее я использовал текущие нано секунды, но в итоге столкнулся с двумя данными, поступающими в те же нано секунды. UUID решает вышеуказанную проблему?

Примечание :: В моем проекте я могу даже получить 10000 строк записей для каждой минуты, и я добавлю эти записи вместе с UIDS в таблицу. И может быть ситуация, когда я остановлю свой продукт и перезапущу его через некоторое время .... Итак, во время этой ситуации, как мог класс UUID прояснить ранее сгенерированные Uids (которые я хранил в БД) с созданием нового (который еще предстоит сбросить в БД)?

Ответы [ 3 ]

11 голосов
/ 20 апреля 2011

Хотя UUID не гарантированно гарантированно уникальны, вероятность дублирования крайне мала.См. Случайная вероятность UUID дубликатов .

. Для вашего приложения имеет смысл использовать UUID, но вы можете на всякий случай иметь дело с крайне редким условием.

7 голосов
/ 20 апреля 2011

Я серьезно сомневаюсь, что вы получаете две записи в одну и ту же наносекунду, поскольку вызов System.nanoTime () занимает более 100 нс. Скорее всего, ваши часы не имеют нано секундной точности.

Однако, если вы перезапустите сервер, вы можете получить повтор nanoTime ().

Одним из способов решения этой проблемы является использование

AtomicLong counter = new AtomicLong(System.currentTimeMillis()*1000);

long id = counter.incrementAndGet();

// something like ctz9yamgu8
String id = Long.toString(counter.incrementAndGet(), 36);

Это запустит счетчик при перезапуске приложения, и они не будут перекрываться между перезапусками, если вы не поддерживаете более миллиона идентификаторов в секунду. (За жизнь инстанса)

Примечание: это работает только для каждого экземпляра. Несколько серверов должны использовать другой подход.

0 голосов
/ 26 ноября 2018

Кажется, на этой странице есть некоторая путаница относительно природы UUID.

Изучите страницу Википедии.Вы увидите, что есть разные версии UUID.

Оригинальная версия представляет точку в пространстве и времени, которая никогда не будет повторяться.Это делается с помощью MAC-адреса компьютера, на котором он генерируется (точка в пространстве).Для этого он сочетает в себе текущий момент.Добавьте произвольное число, которое увеличивается, когда замечено изменение в часах компьютера, теперь это не такая большая проблема, поскольку компьютеры имеют встроенные батареи и сетевые подключения к серверам времени.Сочетая их, практически невозможно столкнуться.

Из-за проблем с безопасностью и конфиденциальностью, связанных с отслеживанием и разглашением MAC-адреса и момента, некоторые люди могут не захотеть использовать эту версию.Например, Sun / Oracle решила не включать в Java реализацию для генерации значений UUID версии 1.

Одной из наиболее часто используемых версий является Версия 4, в которой 122 из 128 битов генерируются случайным образом.Если используется криптографически сильный генератор случайных чисел, это довольно эффективно.Это намного более высокая вероятность коллизий, чем в версии 1. Но для большинства практических сценариев случайный UUID полностью надежен.

...