我正在尝试为我的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%.
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组合。代码黑猩猩
由于UUID的大小是有限的,因此无法使其在所有空间和时间上都是唯一的。
如果您需要一个在任何合理的使用案例中都可以保证唯一的UUID,则可以使用Log4j 2的Uuid.getTimeBasedUuid()。只要您每毫秒生成少于10,000个UUID,它就可以保证大约8,900年的唯一性。
| 归档时间: |
|
| 查看次数: |
16493 次 |
| 最近记录: |