请问有人能举出一种不得不使用UUID的例子吗?从我看到的所有用途中,我都可以看到没有UUID的替代设计。当然,这个设计可能会稍微复杂一些,但至少它没有非零的失败概率。
对我来说,UUID就像全局变量一样。全局变量使得很多设计变得更简单,但这只是懒惰的设计方法。
我为Ruby编写了UUID生成器/解析器,因此我认为自己在这个领域相当熟悉。UUID有四种主要版本:
第4版UUID基本上只是从加密安全的随机数生成器中提取出16个字节的随机数据,并进行一些位操作来标识UUID版本和变体。虽然它们极不可能发生碰撞,但如果使用了伪随机数生成器或者你非常非常非常非常非常倒霉,还是有可能会碰撞的。
第5版和第3版UUID分别使用SHA1和MD5哈希函数,将命名空间与已经唯一的数据结合起来生成UUID。例如,这将允许您从URL生成UUID。仅当底层哈希函数也具有冲突时,才可能发生碰撞。
第1版UUID是最常见的。它们使用网络卡的MAC地址(除非欺骗,否则应该是唯一的),加上时间戳,再加上通常的位操作来生成UUID。对于没有MAC地址的机器,6个节点字节是使用加密安全的随机数生成器生成的。如果两个UUID连续生成得足够快以使时间戳匹配前一个UUID,则时间戳将增加1。除非发生以下情况之一,否则不应该发生碰撞:MAC地址被欺骗;运行两个不同UUID生成应用程序的一台机器在完全相同的时刻产生UUID;两台没有网络卡或没有用户级访问MAC地址的计算机得到相同的随机节点序列,并在完全相同的时刻生成UUID;我们用完了表示时间戳的字节并回滚到零。
实际上,这些事件在一个应用程序的ID空间内不会意外发生。除非您接受像Internet范围内那样的ID,或者在不受信任的环境中,恶意个体可能会在ID冲突的情况下做一些坏事,否则就不必担心这个问题。重要的是要理解,如果你生成了与我相同的版本4 UUID,在大多数情况下,这并不重要。我在完全不同的ID空间中生成了这个ID,因此我的应用程序永远不会知道这个冲突,所以这个冲突并不重要。说实话,在没有恶意行为者的单个应用程序空间中,即使每秒生成相当多的UUID,即使使用版本4 UUID,也会在ID冲突之前很久出现地球上所有生命的灭绝。
另外,2 ^ 64 * 16等于256艾字节。也就是说,在一个应用程序空间内存储256 exabytes的ID之前,您需要有50%的机会发生ID碰撞。
任何事物都有失败的可能性。我建议将注意力集中在更有可能发生的问题上(即你能想到的几乎所有问题),而不是UUID碰撞。
强调“合理”或者像你所说的“有效”的重要性:足够好是现实世界的运作方式。在“实际上唯一”和“真正唯一”之间填补差距所需要的计算工作量非常大。唯一性是一条随着回报递减的曲线。在曲线上某些点上,存在一条分界线,即“足够独特”仍然是可以负担得起的,然后我们会急剧下降。添加更多的唯一性成本非常高。无限唯一性的代价是无穷大。
UUID / GUID是相对而言计算速度快且容易生成的ID的一种方法,可以合理地假定为全球唯一的标识符。这在许多需要整合来自先前不相关系统数据的系统中非常重要。例如:如果您有一个内容管理系统在两个不同平台上运行,但在某些时候需要将一个系统的内容导入另一个系统中。您不希望ID发生变化,因此从系统A中引用的数据与数据B中创建的数据保持完整,但您也不希望数据发生冲突。UUID解决了这个问题。
无需绝对必要创建UUID。然而,有一个标准可以使“离线”用户生成某个键,并具有非常低的碰撞概率。
这有助于数据库复制解决等问题...
对于“在线”用户来说,为某些东西生成唯一键很容易,且不会出现额外负担或者可能性冲突,但这并不是UUID的用途。
无论如何,关于碰撞概率,摘自维基百科:
为了说明这些数字,人类每年被流星撞击的风险被估计为1/170亿,相当于在一年内创建数万亿个UUID并具有1个重复的几率。换句话说,只有在未来100年中每秒生成10亿个UUID,才有约50%的概率创建一个重复的UUID。
你身体中的每个粒子同时通过你正在坐的椅子进行隧道效应并突然发现自己坐在地板上的可能性是存在的,但概率不为零。
你会担心这个吗?
一个经典的例子是当你在两个数据库之间进行复制时。
数据库(A)插入一条记录,ID为10,同时数据库(B)创建了一个ID为10的记录。这就是冲突。
使用UUID将不会发生这种情况,因为它们不会匹配。(几乎可以肯定)
https://dba.stackexchange.com/a/119129/33649
如果你只看看其他选项,例如对于一个简单的数据库应用程序,在创建新对象之前每次查询数据库,你很快就会发现使用UUID可以有效地减少系统的复杂性。当然,如果你使用32位的int键,它将在128位UUID的四分之一中存储。不可否认,UUID生成算法需要比简单递增数字更多的计算能力。但是,谁在乎呢?管理“授权”以分配其他唯一数字的开销轻易超过了这个数量级,具体取决于您打算使用的唯一ID空间。