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

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

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

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

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

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

3 ответов


Если вы получаете столкновение UUID, идите играть в лотерею дальше.

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

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

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

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

Это вероятности случайное столкновение после вычисления N UUIDs, с x=2122:

Н вероятность 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), что эквивалентно шансам создания нескольких десятков триллионов > UUIDs в год и наличия одного дубликата. В другими словами, только после генерации 1 миллиарда UUIDs каждую секунду для следующие 100 лет, вероятность создания только одного дубликата будет около 50%. Вероятность одного дубликата будет около 50%, если каждый человек на Земле владеет 600 миллионами UUIDs.


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

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

цитата из аннотации.

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

в то время как абстрактный утверждает гарантию, есть только 3.4 x 10^38 комбинаций. CodeChimp


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

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