randomUUID是否提供唯一ID?

bir*_*rdy 20 java random uuid

我正在尝试为我的REST API创建会话令牌.每次用户登录时,我都会创建一个新令牌

UUID token = UUID.randomUUID();
user.setSessionId(token.toString());
Sessions.INSTANCE.sessions.put(user.getName(), user.getSessionId());
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何防止重复的sessionTokens.

例如:难道还有一个场景时user1的迹象,并且获得令牌87955dc9-d2ca-4f79-b7c8-b0223a32532a在和user2迹象,得到了令牌87955dc9-d2ca-4f79-b7c8-b0223a32532a.

有没有更好的方法呢?

Tom*_*m G 47

如果您遇到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)

为了正确看待这些数字,有人被陨石击中的年度风险估计是170亿的一次机会,这意味着概率大约为0.00000000006(6×10-11),相当于创造一些的可能性.一年内数以万亿计的> UUID,并且有一个副本.换句话说,只有在接下来的100年中每秒产生10亿UUID之后,创建一个副本的概率大约为50%.如果地球上每个人拥有6亿UUID,则一次重复的概率约为50%.

  • 最初的问题是在REST api的标识符的上下文中.如果你在你的api中产生"数万亿"的会话,是的,那么碰撞可能是一个问题,但我打赌你会先遇到其他问题. (5认同)
  • 几年前,我使用随机 uuid 作为数据库表中的唯一键。第一周内我就遇到了碰撞。随机UUID并不是完全随机的,不能保证不会发生冲突。 (3认同)

Set*_*thB 5

Oracle UUID文档。http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html

他们使用Internet工程任务组中的这种算法。http://www.ietf.org/rfc/rfc4122.txt

摘要摘录。

UUID的长度为128位,可以保证 在空间和时间上的唯一性。

虽然摘要要求保证,但只有3.4 x 10^38组合。代码黑猩猩

  • 保证是一个强有力的词。 (14认同)
  • 那是引用的算法摘要。不是我的话。 (2认同)
  • 不过,我不会使用“保证”一词,并且我认为该摘要在这方面是不正确的。 (2认同)

rgo*_*ers 5

由于UUID的大小是有限的,因此无法使其在所有空间和时间上都是唯一的。

如果您需要一个在任何合理的使用案例中都可以保证唯一的UUID,则可以使用Log4j 2的Uuid.getTimeBasedUuid()。只要您每毫秒生成少于10,000个UUID,它就可以保证大约8,900年的唯一性。