通用唯一标识符(UUID)是一个128位数字,用于标识计算机系统中的信息。 它也被称为全局唯一标识符(GUID)。 UUID的标准表示形式通常由十六进制数字组成:
e5d520d8-d06e-4bc2-9bb9-a28e47014884
总共可以看到32个字符,中间有四个连字符。 为了不辜负他们的名字,UUID应该是唯一的。 实际上,通常情况并非如此-它们的唯一性取决于生成它们的方法或算法。 但是,虽然有可能,但是复制UUID的可能性足够接近零,可以忽略不计。
有多种计算UUID的方法。 我将解释差异是什么,并提供一些实现的见解。
第一个版本的UUID是使用计算机的MAC地址和生成时间生成的通用唯一标识符。
这是否意味着一个UUID版本是完全唯一的? 好吧,他们差不多。 确保唯一性的计算机(或节点)每秒限制为1630亿,但这并不是开发人员经常遇到的问题。
此版本还有其他问题要担心。 几乎可以保证的唯一性是以匿名为代价的。 由于此版本需要考虑时间和唯一的MAC地址,因此可以确定计算机的地址和时间。
我将简短地讨论第二版。 实际上,第二版UUID与第一版相似,并且由于RFC 4122并未提供太多详细信息而很少实现。 实际上,您根本不会使用它们。 它们也称为DCE安全性UUID。
在第三版中,使用加密哈希和应用程序提供的文本字符串来生成UUID。 在此版本中,使用MD5哈希。 基本上,UUID是根据名称生成的。 现在,我们可以使用名称和名称空间来创建一系列UUID。 MD5哈希算法是一种广泛使用的哈希函数,可产生128位哈希值。
最初,MD5被设计为用作加密哈希函数,但现在似乎存在漏洞问题。 找到两条散列为相同值的不同消息太容易了。 因此,它不是您要在应用程序中使用的版本。
伪随机数生成器,也称为确定性随机位生成器,是一种用于生成数字序列的算法,该数字序列的属性近似于随机数序列的属性。 —维基百科
此版本使用伪随机数生成器生成UUID。 使用非常简单。 字符串的每一位都是完全"随机"生成的。 UUID仍然有可能被复制,但由于可能的组合数量很多,所以它很小。 确切的可能性数约为2 12?。
到今天为止,第四版已采用大多数编程语言实现。 它非常易于使用。 我将用Java举例:
UUID uuid = UUID.randomUUID();
版本3和版本5之间的唯一区别是使用了不同的哈希算法。 第五版使用SHA-1而不是MD5。 从技术上讲,它是一种出色的哈希算法,但它也可能遇到与第三版相同的问题。 我不建议使用它。
尽管几乎每个版本都有其长处,但它们也有明显的弱点,可能会损害您的应用程序设计。
第四版是完全随机的,基本上是不可预测的,这是我建议现在使用的版本。
如果您不想在多个数据库实例上发生冲突,或者您不想让ID可预测或提供有关系统的信息,请考虑使用UUID。
UUID的最大好处是,它实际上是唯一的(与保证唯一性相反),对于日常使用来说仍然是完全可以接受的。
这是UUID的主要缺点:
· 例如,无需使用每次在数据库中插入记录时都会增加的索引,而是需要生成UUID。 这可能需要更长的时间。 它没有说明创建的顺序。 如果您需要订购,请考虑不使用UUID对标识符以外的其他东西进行排序。
· 与他们一起工作可能有些奇怪。 UUID也没有说任何有关其所属实体的信息。 这会使调试变得更加困难,尤其是在测试中。
· 该值相当长,可能会影响性能。 但是,如今这些空间更便宜了。
但这也有一些重要的好处:
· UUID的主要优点是它是唯一的。 例如,用户几乎不可能将其猜测为URL参数(公开讨论,因为这可能是安全问题)。 它们在应用程序中是唯一的。
· 它与环境无关。 您可以在任何地方(甚至离线)生成它,而无需依赖数据库来生成标识符。 如果您有多个包含一个数据段(碎片)的数据库,则UUID在所有数据库中都是唯一的,而不仅仅是您现在所在的那个。 这使得在数据库之间移动数据更加安全。