Имеет ли 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 за миллисекунду.