GUID的唯一性在哪里

时间:2012-12-07 01:15:17

标签: c# guid

非常简单的问题。

生成Microsoft GUID时,GUID的哪一部分被视为唯一?以这个guid为例:

19C73070-400A-11E2-B017-3D05D2B0F3CE

我知道在GUID中它有60位指定用于时间戳,48位用于计算机标识符,14位唯一性和6位是固定的。我只是不知道这些订单在哪个订单。

我可以使用上述GUID的哪一部分来获得独特性?不必是不可重复的,但足以识别它。

感谢。

3 个答案:

答案 0 :(得分:3)

所有128位都是唯一性所必需的,可能除了6个固定位之外。可以为不同的时间戳生成相同的随机部分,除了版本之外,生成V1 GUID的任何人都可能与V4 GUID相同。

使用整个GUID或不使用任何内容,如果您需要更短的内容,那么可能还有其他带有随机数生成器+应用程序标识符的选项。

推荐阅读:GUIDs are globally unique, but substrings of GUIDs aren't

答案 1 :(得分:2)

您不应该依赖GUID生成器的实现,因为它可能会更改。这里正确的做法是使用散列算法生成GUID的8字节散列并改为使用它。

答案 2 :(得分:0)

唯一性来自于你或任何人使用公平的guid生成算法再次获得相同guid的机会。 guid算法基本上是一个随机数生成器,选择的数量是如此天文数字,这是任何两个相当生成的guid生成将导致相同数字的极不可能。

有2 ^ 128个唯一的guid,因为guid是128位。如果您只有64位(8字节),那么您只有2 ^ 64个选项。这是一个更小的数字,如果你随机选择你的64位数字,那么你将与另一个随机选择“碰撞”的可能性要大得多。

如果你提供了一些结构,比如说4分钟的日期和时间(smalldatetime)那么你剩下60位的随机数来唯一地标识那一分钟的任何记录。如果您对每分钟重复第n个新记录的ID的(n-1)/ 2 ^ 60可能性感到满意,那么您可以使用它。 (你仍然使用所有64位作为你的ID)否则,增加你的位!

此外,请注意GUID !如果你的数据库中有一个用于管理文件上传的记录,并且布拉格的程序员使用SAME guid来定义一些ActiveX插件 - 那绝对没有问题,因为没有时间某些代码会使用你的记录id来加载activex ,当浏览器意图加载插件时,也不会意外加载你的记录!数字的上下文是数字本身的重要部分。

但是,除非您必须在两个或多个并非始终连接的系统(离线或对等客户端或多个服务器)之间生成新ID,否则请使用串行增量长,而不是由中央机构管理。