0

很简单的问题。

生成 Microsoft GUID 时,GUID 的哪一部分被认为是唯一的?以这个指南为例:

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

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

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

谢谢。

4

3 回答 3

3

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

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

推荐阅读:GUID 是全局唯一的,但 GUID 的子字符串不是

于 2012-12-07T01:28:14.553 回答
2

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

于 2012-12-07T01:21:37.627 回答
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 不必真正的全局唯一才能有用 - 它的隐含信息也是其唯一性的一部分!如果您的数据库中有用于管理文件上传的记录,并且布拉格的程序员使用相同的 guid 来定义一些 ActiveX 插件 - 绝对没有问题,因为某些代码没有时间使用您的记录 id 来加载 activex ,浏览器也不会在打算加载插件时意外加载您的记录!数字的上下文是数字本身的重要组成部分。

但是,除非您必须在不总是连接的 2 个或更多系统(离线或对等客户端或多个服务器)之间生成新 ID,否则请改用由中央机构管理的串行递增 long。

于 2012-12-07T01:44:43.340 回答