手动更改生成的 GUID 并使用它有多糟糕?碰撞的可能性是否仍然微不足道,或者使用 GUID 进行操作是否危险?
有时我们只是更改之前生成的 GUID 的某些字母并使用它。我们应该停止这样做吗?
注意:这个答案错过了一些旧的格式,并且在不久的将来也错过了新的变体。这不应该改变答案的基本思想:不要这样做,你可能会使其变得不唯一(或增加碰撞的机会)。
这取决于 GUID 的版本以及您进行更改的位置。让我们仔细分析一下 GUID 的实际情况:
-
GUID 有一个版本。GUID 中的第 13 个十六进制数字标记其版本。当前的 GUID 通常是使用版本 4 生成的。如果向后更改版本,则可能存在与已存在的 GUID 发生冲突的风险。向前更改它,您将面临与未来潜在的 GUID 发生冲突的风险。
-
GUID 也有一个变体。GUID 中的第 17 个十六进制数字是变体字段。其中一些值是为了向后兼容而保留的,一个值是为了将来的扩展而保留的。因此,更改其中的某些内容意味着您可能会面临与之前生成的 GUID 或将来生成的 GUID 发生冲突的风险。
-
GUID 的结构因版本而异。版本 4 GUID 使用(大部分 - 第 17 个十六进制数字除外)真正随机或伪随机位(在大多数实现中是伪随机的)。改变那里的一些东西,碰撞的概率保持不变。
它对于使用哈希值的版本 3 和版本 5 GUID 应该非常相似,尽管我不记得曾经在野外见过。不过,版本 1 和版本 2 的情况就不那么严重了。它们有一个结构,根据你改变的地方,你会让事情变得困难。
-
版本 1 GUID 包含时间戳如果在同一时钟间隔内生成两个 GUID(因此会导致相同的时间戳),则计数器字段会递增。如果更改时间戳,则可能会与同一台计算机上较早或较晚生成的 GUID 发生冲突。如果更改计数器,则可能会与同时生成的 GUID 发生冲突,因此需要计数器作为“唯一符”。
-
版本 2 GUID 在版本 1 的基础上进行了扩展,并且还包含用户 ID。时间戳不太准确,包含用户或组 ID,而计数器的一部分用于指示哪个 ID(但仅对生成机器有意义)。因此,如果更改这些部分,您可能会面临与同一台计算机上其他用户生成的 GUID 发生冲突的风险。
-
版本 1 和 2 GUID 包括 MAC 地址。具体来说,是生成它们的计算机的 MAC 地址。这确保了来自不同机器的 GUID 是不同的,即使是在同一时刻生成的。如果计算机没有 MAC 地址,则存在后备方案,但无法保证唯一性。 MAC 地址也有一个结构,由“组织唯一标识符”(OUI;由本地管理或由 IEEE 分发)和网卡的唯一标识符组成。
如果您对 OUI 进行更改,则可能会与使用其他制造商的网卡的计算机中生成的 GUID 发生冲突。除非您进行更改,使第一个八位位组的第二个最低有效位为 1,在这种情况下,您将切换到本地管理的 OUI,并且仅存在与具有被覆盖的 MAC 地址的计算机上生成的 GUID 发生冲突的风险(这可能会导致包括大多数具有虚拟网络硬件的 VM)。
如果您偶然发现卡标识符,则可能会遇到与具有同一制造商的其他网卡的计算机上生成的 GUID 发生冲突的风险,或者与 MAC 地址被覆盖的计算机发生冲突的风险。
到目前为止还没有其他版本,但要点如下:GUID 需要其所有部分来确保唯一性;如果你改变了一些东西,你最终可能会得到一个不再是唯一的 GUID。所以你可能让它更像是一个神什么的。最安全的更改可能是当前版本 4 GUIDe(Windows 和 .NET 将生成的),因为它们实际上并不保证独特,而是创造非常非常不可能.
一般来说,我认为生成一个新的 GUID 会更好。这也对阅读它们的人有帮助,因为如果两个 GUID 看起来完全不同,您可以很容易地将它们区分开来。如果它们仅相差一位数,人们可能会错过更改并假设 GUID 相同。
此外,另一个地方的另一个人可能被迫做与您所做的相同的事情,也许是相同的数字,这样您最终会得到两个相同的 GUID。考虑到正常情况下发生冲突的可能性(非常低),在一个大型项目中,可能会以这种方式从同一个 GUID 派生出多个 GUID,这实际上可能是最可能的冲突原因。
进一步阅读:
- 维基百科:GUID http://en.wikipedia.org/wiki/GUID
- 维基百科:UUID http://en.wikipedia.org/wiki/UUID
- Eric Lippert:GUID 指南。Part 1 http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx, part 2 http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx, part 3 http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx。 (读一下;这个人可以很好地解释,而且碰巧也在 SO 上)
- 维基百科:MAC地址 http://en.wikipedia.org/wiki/MAC_address
- RFC 4122:GUID 版本 https://www.rfc-editor.org/rfc/rfc4122#section-4.1.3
- RFC 4122:变体字段 https://www.rfc-editor.org/rfc/rfc4122#section-4.1.1
- DCE 1.1:身份验证和安全服务 – 版本 2 GUID 的描述 http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01
- Raymond Chen:GUID 是全球唯一的,但 GUID 的子字符串不是 http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
- Raymond Chen:GUID 的设计是唯一的,而不是随机的 http://blogs.msdn.com/b/oldnewthing/archive/2012/05/23/10309199.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)