Jas*_*ker 121 sql-server guid
我正在使用SQL Server 2000中的一个数据库,该数据库为每个使用它所绑定的应用程序的用户使用GUID.不知何故,两个用户最终得到了相同的GUID.我知道微软使用一种算法来生成一个随机GUID,这个GUID极有可能导致碰撞,但是碰撞仍然可能吗?
Tom*_*ter 127
基本上没有.我觉得有人跟你的数据库混在一起.根据您使用的版本GUID,值是唯一的(对于版本1 GUID之类的东西),或者是唯一的和不可预测的(对于版本4 GUID之类的东西).SQL Server的NEWID()函数实现似乎使用128位随机数,因此您不会发生冲突.
对于1%的碰撞机会,您需要生成大约2,600,000,000,000,000,000个 GUID.
Pop*_*lin 107
基本上他们是不可能的!,天文数字很低.
但是......我是世界上唯一一个我知道的人,曾经有一次GUID colision(是的!).
我很有信心,这不是一个错误.
如何实现,在Pocket PC上运行的小型应用程序中,在操作结束时必须发出具有生成的GUID的命令.在服务器上执行该命令后,该命令与执行日期一起存储在服务器上的命令表中.有一天,当我调试时,我发出了模块命令(附加了新生成的GUID),没有任何反应.我再次做了(使用相同的guid,因为guid仅在操作开始时生成一次),并且再次没有,最后试图找出命令未执行的原因,我检查了命令表,和3周前插入的当前GUID相同.不相信这一点,我从2周的备份中恢复了数据库,并且guid就在那里.检查代码,新的guid新生成毫无疑问.
编辑:有一些因素可能会大大增加这种情况发生的可能性,应用程序在PocketPC模拟器上运行,并且模拟器具有保存状态功能,这意味着每次恢复状态时本地时间也会恢复并且guid基于内部计时器....紧凑框架的guid生成算法可能不如例如COM ...
Ben*_*ein 32
它们在理论上是可行的,但是对于3.4E38可能的数字,如果你在一年内创造了数万亿的GUID,那么一个副本的可能性是0.00000000006(来源).
如果两个用户最终使用相同的GUID,我会打赌程序中存在导致数据被复制或共享的错误.
Gre*_*ech 20
首先让我们看看两个GUID发生冲突的可能性.正如其他答案所说的那样,由于生日悖论,它不是1 ^ 2 128(10 ^ 38),这意味着对于两个GUID碰撞的概率为50%,概率实际上是2 ^ 64(10 ^ 19)这个要小得多.但是,这仍然是一个非常大的数字,因此假设您使用合理数量的GUID的冲突概率很低.
另请注意,GUID不包含时间戳或MAC地址,因为许多人似乎也相信.这对于v1 GUID是正确的,但是现在使用了v4 GUID,它们只是一个伪随机数,这意味着碰撞的可能性可以说更高,因为它们不再是时间和机器所特有的.
所以基本上答案是肯定的,碰撞是可能的.但他们极不可能.
编辑:固定为2 ^ 64
Ton*_*Lee 17
两个随机GUID冲突的可能性(在10 ^ 38中为~1)低于未检测到损坏的TCP/IP分组的机会(在10 ^ 10中为~1). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf,第11页.磁盘驱动器,CD驱动器等也是如此......
GUID在统计上是唯一的,您从数据库中读取的数据仅在统计上是正确的.
Phi*_*Lho 11
请参阅Wikipedia的全球唯一标识符文章.有几种方法可以生成GUID.显然旧的(?)方式使用Mac地址,时间戳到一个非常短的单位和一个独特的计数器(在同一台计算机上管理快速生成),所以使它们复制几乎是不可能的.但是这些GUID被删除了,因为它们可以用来追踪用户......
我不确定微软使用的新算法(文章说可以预测一系列GUID,看起来他们不再使用时间戳了?上面链接的微软文章说了别的......).
现在,GUID经过精心设计,按名称,全球独一无二,因此我将冒险这是不可能的,或者非常非常低的概率.我会去别处看看.
我将以“我不是网络人士,因此我可能在后面说完全不连贯的句子”作为开头。
当我在伊利诺伊州立大学工作时,我们有两个在不同时间订购的Dell台式机。我们将第一个放入网络,但是当我们尝试将第二个放入网络时,我们开始收到疯狂的错误。经过大量的故障排除后,确定两台计算机都在生成相同的GUID(我不确定确切用于什么目的,但是这使它们在网络上均无法使用)。戴尔实际上将两台计算机都更换为有缺陷的。
我知道人们喜欢一个很好的答案,即GUID是神奇的,并且保证是唯一的,但是实际上,大多数GUID只是121位随机数(其中有7位浪费在格式化上)。如果您不喜欢使用大随机数,那么使用GUID也不适合。
有一个公式可以估计要生成多少个大小为 S 的值才能以概率 P 获得其中两个值之间的碰撞。
变量:
为了获得碰撞,你必须围绕以下内容生成:
或者用Python:
from math import sqrt, log
def how_many(bits, probability):
return 2 ** ((bits + 1) / 2) * sqrt(-log(1 - probability))
Run Code Online (Sandbox Code Playgroud)
对于 GUID(128 位),要获得概率为 1% (0.01) 的冲突,您需要:
In [2]: how_many(bits=128, probability=0.01)
Out[2]: 2.6153210405530885e+18
Run Code Online (Sandbox Code Playgroud)
...大约 2.6 * 10^18 GUID(即42 艾字节的 GUID)。
请注意,此概率增长迅速。无论位数是多少,99.99% 的概率只需要比 1% 多 30 倍的 GUID!
In [3]: how_many(bits=128, probability=0.9999)
Out[3]: 7.91721721556706e+19
Run Code Online (Sandbox Code Playgroud)
相同的数字,但对于 int64 数据类型:
In [4]: how_many(bits=64, probability=0.01)
Out[4]: 608926881
In [5]: how_many(bits=64, probability=0.9999)
Out[5]: 18433707802
Run Code Online (Sandbox Code Playgroud)
对于 1% 的冲突概率,您需要5 GB的 int64-s。虽然仍然很多,但与 GUID 相比,这是一个更容易理解的数字。
这就是所谓的生日问题- 在这篇维基百科文章中,您可以找到比本文更精确的估计公式。
| 归档时间: |
|
| 查看次数: |
66880 次 |
| 最近记录: |