Java的UUID.randomUUID有多好?
我知道随机UUID在理论上具有非常,非常,非常低的碰撞概率,但是我想知道,在实践中,Java的randomUUID()
在没有碰撞方面有多好?有没有人有什么经验可以分享?
我知道随机UUID在理论上具有非常,非常,非常低的碰撞概率,但是我想知道,在实践中,Java的randomUUID()
在没有碰撞方面有多好?有没有人有什么经验可以分享?
UUID使用java.security.SecureRandom
,它应该是“加密强大的”。虽然没有指定实际实现,并且可以在JVM之间变化(这意味着所做的任何具体语句仅对一个特定的JVM有效),但它确实要求输出必须通过统计随机数生成器测试。
一个实现总是有可能包含破坏这一切的微妙错误(参见OpenSSH密钥生成错误),但我认为没有任何具体的理由担心Java UUID的随机性。
维基百科有一个很好的答案 http://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions
为了获得至少一次碰撞的50%概率而需要生成的随机版本4 UUID的数量为2.71万亿,计算如下:
...
这个数字相当于在大约85年内每秒生成10亿个UUID,而包含这么多UUID的文件,每个UUID16字节,大约是45 EB,比目前存在的最大数据库大很多倍,这些数据库的数量级为数百PB。
...
因此,要使十亿分之一的重复机会,必须生成103万亿个版本4 UUID。