我真的不明白这一点 Usb驱.我知道碰撞的概率是 有效地nil, 但 有效地nil 甚至没有接近于不可能的。

有人可以得到的一个例子,你没有选择,只能使用usb驱?从所有使用我所看到的,我可以看到一种替代设计而不usb驱.确保设计可能会稍微更加复杂,但至少它不会有一个非零故障概率。

Usb驱闻起来像全球变量给我。有许多方面全球变量使用较简单的设计,但它只是懒惰的设计。

有帮助吗?

解决方案

我写了Ruby的UUID生成器/分析器,所以我认为自己是关于这个问题相当灵通。有四个主要的UUID版本:

版本4点的UUID基本上只是16从加密的安全随机数生成器拉到字节随机性,具有一定的位变换来识别UUID版本和变体。这是极不可能发生碰撞,但如果使用PRNG或者可能发生,如果你恰好有真的,真的,真的,真的,真的很倒霉。

版本5和版本3的UUID分别使用SHA1和MD5散列函数,一个命名空间用一块已独特数据的组合以生成一个UUID。这将,例如,允许您从一个URL产生UUID。这里碰撞是唯一可能的,如果基础散列函数还具有碰撞。

版本1点的UUID是最常见的。他们使用网卡的MAC地址(除非欺骗,应该是唯一的),加上时间戳,再加上平时位变换来生成UUID。在不具有MAC地址的机器的情况下,被以加密安全随机数发生器产生的6个节点字节。如果在序列足够快时戳以前的UUID匹配产生两个的UUID,时间戳是由1碰撞递增,除非发生以下情况之一不应发生:MAC地址被伪造;一台机器运行两个不同的UUID生成应用程序产生在完全相同的时刻的UUID;没有网络卡或没有用户级访问的MAC地址两台机器被给予相同的随机节点序列,并生成在完全相同的时刻的UUID;我们用完的字节来表示时间戳和侧翻回零。

实际上,没有发生这些事件由单个应用程序的ID空间内的事故。除非你,比如说,一个互联网大规模接受的ID,或与不信任的环境,恶意个人可能能够做坏事在ID冲突的情况下,它只是不是你应该担心的。它的关键明白,如果你碰巧产生相同的版本4的UUID为我做的,在大多数情况下,它并不重要。我已经生成的ID从你的一个完全不同的ID空间。我的应用程序将永远不会知道的碰撞,因此碰撞无所谓。坦率地说,在没有恶意演员一个单一的应用空间,会让你有一个碰撞之前,甚至在第4版的UUID出现在地球上所有生命的灭绝长,即使你每秒产生了不少的UUID。

另外,2 ^ 64 * 16是256个艾字节。正如,你将需要存储256个艾字节值得ID的你在一个单一的应用空间有一个ID碰撞的50%的机会了。

其他提示

这件事,付给你买的那是很难做到,否则是获得一个独特的标识符 不具有咨询或协调中央权力机构.一般问题能够得到这样的事情没有某种形式的管理基础设施问题的应付解决。

我读的是,根据生悖论的机会痕碰撞时发生的是50%的曾经有2^64付已产生的。现在2^64是一个相当大的数量,但有50%的机会碰撞似乎太危险(例如,有多少应付需要存在之前有5%的机会能发生碰撞的-即使这看起来太大的概率)。

该问题与这一分析是双重的:

  1. 付不是完全随机的-有主要组成部分usb驱,是时间和/或基于位置的.因此,要有任何真正的机会,在一个碰撞,碰撞付需要砥产生在准确的相同时间从不同的usb驱发电机。我想说的是,虽然有一个合理的机会,几个usb驱可能产生的同时,有足够的其他黏糊糊的东西(包括地理位置信息或随机的位)使likeyhood之间碰撞的这个非常小的付几乎是不可能的。

  2. 严格地讲,应付只需要独特之间设定的其他付他们可能比较反对。如果你产生痕,用作数据库的关键,这个问题不如其他地方在一个邪恶的宇宙,相同的东西是用来识别COM接口。就像它会造成任何混乱,如果没有人(或)其他名为"迈克尔*伯尔"关于阿尔法星。

一切有非零机会发生故障。我会集中于更有可能发生的问题(即你能想到的几乎所有的东西),比的UUID的碰撞

这是“合理的”,或者如你所说的那样,“有效”的强调:不够好,是真正的世界是如何运作。的计算工作涉及的覆盖之间“几乎唯一”和“独一无二”这个差距的量是巨大的。唯一性是收益递减的曲线。在这条曲线上的某一点,有区别在哪里“够了独特的”仍然是经济实惠的线路,然后我们非常曲线陡峭。增加更多独特的成本变得相当大。无限唯一性具有无限成本。

UUID / GUID是,相对而言,在计算上快速简便的方法,以产生一个ID可以是合理假定为全局唯一。这是非常重要的,其中需要将数据从先前未连接的系统集成多个系统。例如:如果你有它运行在两个不同平台的内容管理系统,但在某些时候需要从一个系统的内容导入到另一个。你不想ID的更改,所以从系统的数据之间的引用保持不变,但是你不想在系统中创建的数据发生任何冲突B. UUID的解决这个问题。

这是永远不会绝对必要创建一个UUID。它是,但是方便,有一个标准在那里的离线的用户可以分别产生与碰撞的概率非常低的一个关键的东西。

这可以在数据库复制分辨率帮助等...

这将是非常容易的在线的用户生成的东西,而不开销或碰撞的可能性唯一的密钥,但是这不是什么的UUID是。

反正,上冲突的概率的单词,维基百科采取:

  

为了把这些数字变成的角度来看,一个每年被打的风险   由陨石估计是一个机会,在17个十亿,相当于   在每年创造几十的UUID万亿的赔率和   有一个重复。换句话说,生成1份十亿只后   UUID的每一秒钟在未来100年里,创造的概率   只有一个重复的将是约50%。

还有一个概率不为零,在身体的每一个粒子将通过椅子同时隧道你坐在你会突然发现自己坐在地板上。

你担心?

一个典型的例子是,当你两个数据库之间复制。

DB(A)插入具有INT ID 10的记录,并在同一时间DB(B)创建与ID 10。这是碰撞的一个记录。

使用的UUID这种情况不会发生,因为他们将不会匹配。 (几乎肯定)

我有用于避免的UUID的方案。地方设置一台服务器,并将它让每一位了一个软件想要一个通用唯一标识符时,他们联系该服务器,并将其一只手出来。简单!

除了有这个一些真正的实际问题,即使我们忽略彻底恶意。特别是,服务器可能失败或从互联网的一部分,变得无法访问。与服务器故障问题需要复制,这是的非常困难的获取权(见的Paxos演算法为什么建立共识是尴尬的文学),是相当缓慢了。此外,如果所有的服务器都无法访问从“网络的特定部分,的连接到该子网的客户端将能够做任何事情,因为他们都会是等待新的ID。

所以...用一个简单的概率算法生成它们是不可能的地球,或(基金和)构建将是一个部署PITA和有故障频发的重大基础设施的寿命过程中失败。我知道我会去的是哪一个。

如果你只是看的替代品如一个简单的数据库应用程序,有你创建一个新对象之前,每次查询数据库,你很快就会发现,使用UUID可以有效降低系统的复杂性。诚然 - 如果你使用int键是32位,这将在128位UUID的四分之一存储。诚然 - UUID生成算法占用更多的计算能力不是简单地增加一个数字。但谁在乎?管理的“权威”的开销很容易地通过数量级,否则分配唯一的数字远远超过在这取决于你的意图的独特ID空间。

在UUID ==懒惰设计

我不同意其关于选择你的战斗。如果重复的UUID是统计学上不可能的,数学证明,为什么担心呢?花时间在你小的N UUID发电系统设计是不切实际的,总有十多种方法可以提高你的系统。

我不明白所有人都在谈论发生碰撞的可能性。我不关心碰撞。我关心的性能虽然。

https://dba.stackexchange.com/a/119129/33649

  

的UUID是非常大的表性能的灾难。 (200K行是   不是 “非常大的”。)

     

您#3是真的不好当字符内SET是UTF8 - CHAR(36)   占用108个字节!

     

的UUID(GUID)的非常 “随机”。使用它们无论是作为唯一或   大表的主键是非常低效的。这是因为   不必每次跳跃表/索引插入一个新的UUID   或UUID选择。当表/索引过大,以适应高速缓存   (见innodb_buffer_pool_size,其必须比RAM小,   通常为70%)中,“下一个” UUID可以不被缓存,因此具有较慢的磁盘   击中。当表/指数是20倍大缓存中,只有1/20   (5%)的命中高速缓存的 - 你是I / O绑定

。      

因此,不使用的UUID除非任何

     

你有“小”的表,或者你真的需要它们,因为产生的   来自不同地方的唯一ID(和还没有想出另一种方式   去做吧)。更多的UUID: http://mysql.rjweb.org/doc.php/uuid(它   包括功能标准的36字符的UUID和之间的转换   BINARY(16)。)

     

同时具有UNIQUE AUTO_INCREMENT和唯一的UUID在同一   表是一种浪费。

     

当一个INSERT发生时,所有唯一/主键必须检查   重复。无论是独特的密钥足以满足InnoDB的要求   的具有主键。 BINARY(16)(16个字节)是有点笨重(一   针对使其成为PK)的说法,但没有那么糟糕。蓬松   当你有第二个键很重要。 InnoDB的默默大头针的PK   到每个二级密钥的结尾。这里的主要教训是   最小化二次键的数目,特别是对于非常大的   表。对于对比:INT UNSIGNED是4个字节的范围0..4   十亿。 BIGINT为8个字节。

在我的最后一份工作,我们得到来自中唯一与UUID标识的第三方对象。我把一个UUID->长整型查找表和用于长整型作为我的主键,因为它是方式更快的方式。

使用版本1算法似乎它是从相同的MAC地址生成每毫秒小于10点的UUID的约束下不可能碰撞

  

在概念上,原始(版本1)   对于UUID的生成方案是   连接具有的UUID版本   那就是计算机的MAC地址   生成UUID,并与   的100纳秒的时间间隔数   由于采用公历的   日历在西方。在实践中,   实际的算法更为复杂。   该方案受到批评   它不是足够“不透明”;   它揭示了双方的身份   生成该UUID计算机和   在它这样做的时间。

有人纠正我,如果我误解了它是如何工作的。

可能的(一些可笑的小概率)发生碰撞,而你的数据库生成的密钥不会......你知道的人为错误的机会,造成了

要那些说的UUID是糟糕的设计,因为他们的在你的DB碰撞产生的,因为一些非forseen需要按键比UUID4碰撞的机会远远高得多。我们的知道的是,如果该数据库被重建将在1再次启动ID,以及我们有多少不得不重新创建一个表时,我们确信我们将永远需要?我把我的钱UUID safeness东西时开始的任何一天,未知的未知走错了。

除了,你必须使用别人的API,它需要一个UUID的情况下,当然总是有另一种解决方案。但是,将这些解决方案的所有的的问题,这些问题的UUID吗?你会最终加入黑客更多的层,每解决一个不同的问题,当你可能会立即解决所有这些?

是,这在理论上是可能的UUID的碰撞。正如其他人指出,这是可笑的可能性不大,它只是不值得考虑的一点。这是从来没有发生过的最新,最有可能永远不会。忘掉它。

最“明显”的方式来避免碰撞是让一台服务器上生成每个插入,这显然造成严重的性能问题,并没有在所有解决脱机生成问题的唯一ID。糟糕。

在其他的“明显的”解决方案是,手了唯一编号的块预先,这基本上是什么UUID V1确实通过使用所述生成机的MAC地址(通过IEEE OUI)一个中央权力机构。但重复的MAC地址不发生,因为每一个中央权力机构搞砸了,最终,因此在实践中,这是不是一个UUID V4碰撞更有可能。糟糕。

针对使用UUID最好的说法是,他们是“太大”,但(显著)更小的方案都将注定失败,解决了最有趣的问题;的UUID尺寸为解决这些问题很它们的有用的固有副作用。

有可能你的问题不是大到足以需要什么的UUID提供,并且在这种情况下,随意使用别的东西。但是,如果你的问题意外增长(和大多数人),你最终会后交换 - 和踢自己在一开始就不使用它们。为什么设计失败的时候,它只是作为易于设计的成功呢?

的UUID体现所有的全局变量,仅相关联的恶化的不良编码实践,因为它们是可以在不同的片盒的分布超全局变量。

最近打这样的问题,与替换一个确切的换代车型的打印机,并发现没有客户端软件会工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top