C#System.Guid.NewGuid()在多大程度上对以下情况安全?

时间:2016-07-23 18:06:13

标签: c# random guid

我正在构建一个应用程序。 假设它是一个消息传递应用程序,并且变得像whatsapp一样受欢迎。

将为世界上发送的每条消息提供GUID。

如果世界上任何2个GUID相等,就会出现问题。

截至今日30亿!(官方)whatsapp消息在一天内发送到世界各地。

我正在使用C#(Xamarin)的System.Guid.NewGuid方法来生成GUID。

出现“问题”的可能性是什么,因为随机数不是真正随机的?

(这个问题与其他问题不同,因为它描述了每天有数百万人获得数十亿新GUID的情况。)

1 个答案:

答案 0 :(得分:0)

我喜欢维基百科的这段话:

  

它们可能是也可能不是由随机(或伪随机)数字生成的。从随机数生成的GUID通常包含6个固定位(这些指示GUID是随机的)和122个随机位;唯一此类GUID的总数是2122(约5.3×1036)。这个数字是如此之大,以至于随机生成两次相同数字的概率可以忽略不计; [引证需要]然而其他GUID版本具有不同的唯一性属性和概率,范围从保证唯一性到可能重复。假设统一概率简单,如果2014年全球每个人拥有6亿个GUID,则一个重复的概率约为50%。

https://en.wikipedia.org/wiki/Globally_unique_identifier

如果您真的担心,您始终可以选择并能够创建碰撞检测方法。例如,如果您检测到GUID已在使用中,则只需指定一个新的随机GUID并对其进行迭代,直到检测不到重复为止。让我想起哈希表。对此存在性能损失,但只知道您的障碍有解决方案!

<强>更新

我可以理解你对随机性的关注,但是如果你考虑到它是一个结构化的算法,它几乎会按时间顺序排列(按类型)。与此有关的问题很少,我只关心使用128位值进行主键解析的性能下降。

同样来自维基百科:

  

GUID通常用作数据库表的主键,并且通常该表在该属性上具有聚簇索引。这在插入记录时会出现性能问题,因为完全随机的GUID意味着记录可能需要插入表中的任何位置,而不是仅仅附加在其末尾附近。