UUID的出现,是为了让分布式系统可以不借助中心节点,就可以生成唯一标识来识别一些信息;
GUID跟UUID是同一个东西,只是来源于微软。
UUID经过了多个版本的演化,每个版本的算法都不同。
版本1:基于时间的UUID
通过高精度时间戳、机器MAC地址生成;由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,它暴露了电脑的MAC地址和生成这个UUID的时间,而且可以被推测,这也是这个版本的UUID被诟病的地方。
注意:使用这个版本生成UUID时,不能在同一台机器上同一时间使用多个线程或进程生成,否则可能会重复。同时由于虚拟机、容器等虚拟环境的出现,也使得机器MAC地址不再唯一,导致这个版本UUID重复的概率大量激增。
版本2:DCE安全的UUID
DCE安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。
不过,在UUID的规范里面没有明确地指定,所以基本上所有的UUID实现都不会实现这个版本。
版本3:基于名字空间的UUID(MD5)
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
版本4:基于随机数的UUID
根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的(百万分之一),这个版本是被应用最多的版本;
版本5:基于名字的UUID(SHA1)
和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
推荐使用版本1和版本4,对于暴露MAC地址不敏感的场景可以使用版本1;
PHP UUID库:https://github.com/ramsey/uuid
Node.js UUID库:https://github.com/uuidjs/uuid
常见的UUID库:https://github.com/search?o=desc&q=uuid&s=stars&type=Repositories