Имеет ли randomUUID уникальный идентификатор?

Я пытаюсь создать токены сеанса для моего REST API. Каждый раз, когда пользователь входит в систему, я создаю новый токен

UUID token = UUID.randomUUID();
user.setSessionId(token.toString());
Sessions.INSTANCE.sessions.put(user.getName(), user.getSessionId());

Однако я не уверен, как защитить от дублирования sessionTokens.

Например: может ли быть сценарий, когда пользователь1 подписывается и получает токен 87955dc9-d2ca-4f79-b7c8-b0223a32532a и пользовательский 87955dc9-d2ca-4f79-b7c8-b0223a32532a а также получает токен 87955dc9-d2ca-4f79-b7c8-b0223a32532a.

Есть ли лучший способ сделать это?

Ответ 1

Если вы столкнетесь с UUID-коллизией, поиграйте в лотерею.

Из Википедии:

Произвольно генерируемые UUID имеют 122 случайных бита. Из всего 128 бит для версии используются четыре бита ("Произвольно сгенерированный UUID") и два бита для варианта ("Leach-Salz").

При случайных UUID вероятность двух значений, имеющих одинаковое значение, может быть рассчитана с использованием теории вероятности (парадоксальный день рождения). Используя приближение

p(n)\approx 1-e^{-\tfrac{n^2}{{2x}}}

это вероятности случайного столкновения после вычисления n UUID, с x = 2122:

n вероятность 68 719 476 736 = 236 0,0000000000000004 (4 × 10-16) 2,199,023,255,552 = 241 0,0000000000004 (4 × 10-13) 70,368,744,177,664 = 246 0,0000000004 (4 × 10-10)

Чтобы представить эти цифры в перспективе, ежегодный риск того, что кто-то попадает в метеорит, оценивается как один шанс в 17 миллиардов, что означает, что вероятность составляет около 0,00000000006 (6 × 10-11), что эквивалентно шансам создания нескольких десятки триллионов> UUID в год и имеющие один дубликат. Другими словами, только после генерации 1 миллиарда UUID каждую секунду в течение следующих 100 лет вероятность создания всего одного дубликата составит около 50%. Вероятность одного дубликата будет составлять около 50%, если каждому человеку на земле принадлежит 600 миллионов UUID.

Ответ 2

Документ Oracle UUID. http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html

Они используют этот алгоритм из Целевой группы Internet Engineering. http://www.ietf.org/rfc/rfc4122.txt

Цитата из реферата.

UUID имеет длину 128 бит и может гарантировать уникальность в пространстве и времени.

Хотя абстрактная претензия гарантирует, что существует только 3.4 x 10^38 комбинаций. CodeChimp

Ответ 3

Поскольку UUID имеет конечный размер, нет никакого способа быть уникальным во всем пространстве и времени.

Если вам нужен UUID, который гарантированно будет уникальным в любом разумном случае, вы можете использовать Log4j 2 Uuid.getTimeBasedUuid(). Он гарантированно будет уникальным в течение примерно 8 900 лет, пока вы создадите менее 10 000 UUID за миллисекунду.