很简单的问题。
生成 Microsoft GUID 时,GUID 的哪一部分被认为是唯一的?以这个指南为例:
19C73070-400A-11E2-B017-3D05D2B0F3CE
我知道在 GUID 中,它有 60 位指定用于时间戳,48 位用于计算机标识符,14 位唯一性,6 位是固定的。我只是不知道这些是什么顺序。
我可以使用上述 GUID 的哪一部分来获得唯一性?不必是不可复制的,但足以识别它。
谢谢。
唯一性需要所有 128 位,可能除了 6 个固定位。可以为不同的时间戳生成相同的随机部分,并且生成 V1 GUID 的任何人都可能得到与 V4 GUID 相同的版本,除了版本。
使用整个 GUID 或不使用任何东西,如果您需要更短的内容,那么可能还有其他选项带有随机数生成器 + 应用程序标识符。
您不应该依赖 GUID 生成器的实现,因为它可能会改变。正确的做法是使用散列算法生成 GUID 的 8 字节散列并改用它。
独特性来自您或任何人使用公平的 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。