UUID会重复吗

有的人说一定不会重复,也有的人说很小几率会重复,其实都有可能,取决于代码中使用的是哪种UUID生成方式,或者说,使用的是哪种UUID算法。

  • UUID Version 1:基于时间的UUID
    基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址(不考虑手动更改MAC地址的情况)。
  • UUID Version 2:DCE安全的UUID
    DCE(Distributed Computing Environment)安全的UUID,和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
  • UUID Version 3:基于名字的UUID(MD5)
    基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同命名空间中不同名字生成的UUID的唯一性;不同命名空间的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
  • UUID Version 4:随机UUID
    根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来
  • UUID Version 5:基于名字的UUID(SHA1)
    和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

应该用哪种

从UUID的不同版本中可以看出

  • Version 1.2 适合应用于分布式计算环境下,具有高度唯一性
  • Version 3.5 适合于一定范围内名字唯一,且有需要生成重复UUID的场景下
  • Version 4 最为简单和方便,适合数据量不是特别大的场景下,Java默认的uuid工具便是此种
    在这里插入图片描述

狗屎运总在不经意中到来

老生常谈,目前所有的随机数发生器都是伪随机数,JVM的随机数找到底也是采集于操作系统中一个特殊的设备:熵池。在linux系统中这个设备位于/dev/random(他是一个阻塞性的),当熵池噪声不够的时候随机数生成能力会下降。然后呢,就看运气了,我在之前的一个项目的开发过程中遇到过一次uuid重复,以后就再也没出现过。
综合来看,一般情况下使用Ver.4的算法是没什么太大的问题的,如果追求高并发或者大数据量处理可以使用Ver.1,毕竟再趋近于0的概率也是会有一个1存在。

节选自知乎文章https://www.zhihu.com/question/34876910

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐