注意:此答案遗漏了一些旧格式,并且在不久的将来还会有新变体。这并不改变答案的基本思想:不要这样做,否则可能使其非唯一(或增加碰撞的几率)。
这取决于GUID的版本以及您正在进行更改的位置。让我们稍微剖析一下GUID的实际样式:
1. GUID有一个版本。 GUID中的第13个十六进制数字标记了其版本。当前的GUID通常是使用版本4生成的。如果你将版本向后更改,可能会与已经存在的GUID发生冲突。如果你将版本向前更改,可能会与未来可能生成的GUID发生冲突。
2. GUID也有一个变体。 GUID中的第17个十六进制数字是变体字段。其中一些值被保留用于向后兼容,一个值被保留用于未来扩展。因此,在那里进行更改意味着你可能会与先前生成的GUID或将来生成的GUID发生冲突。
3. 根据版本不同,GUID的结构也不同。 版本4的GUID主要(除了第17个十六进制数字)使用真正随机或伪随机位(在大多数实现中为伪随机)。在那里进行更改,碰撞的概率基本保持不变。
对于使用哈希的版本3和5的GUID,应该非常相似,尽管我从未在实际中见过。但对于版本1和2来说就不太一样了。它们具有一定的结构,根据你在哪里进行更改,会使事情变得困难。
4. 版本1的GUID包含一个时间戳和一个计数器字段,如果在同一时钟间隔内生成了两个GUID(因此会导致相同的时间戳),则计数器会递增。如果你更改时间戳,可能会与之前或之后在同一台机器上生成的GUID发生冲突。如果你更改计数器,可能会与在同一时间生成并且需要计数器作为“唯一标识符”的GUID发生冲突。
5. 版本2的GUID在版本1的基础上增加了用户ID。 时间戳不太准确,并包含用户或组ID,而计数器的一部分用于指示所指的用户或组(但只对生成机器有意义)。因此,通过更改这些部分,可能会与同一台机器上其他用户生成的GUID发生冲突。
6. 版本1和2的GUID包含MAC地址。 具体来说,是生成它们的计算机的MAC地址。即使在完全相同的瞬间生成,这确保了来自不同计算机的GUID是不同的。如果一台机器没有MAC地址,则会有一个备选方案,但那时就无法保证唯一性了。MAC地址也具有结构,由“组织唯一标识符”(OUI;可以是本地管理的或由IEEE分配的)和网络卡的唯一标识符组成。
如果你更改OUI,可能会与具有其他制造商网络卡的计算机生成的GUID发生冲突。除非你将更改设置为使第一个八位字节的次最低有效位为1,这样你就切换到了本地管理的OUI,并且只会与具有覆盖MAC地址的计算机生成的GUID发生冲突(其中可能包括大多数使用虚拟网络硬件的虚拟机)。
如果你更改卡标识符,可能会与同一制造商的其他网络卡计算机生成的GUID发生冲突,或者再次与覆盖MAC地址的计算机生成的GUID发生冲突。
目前还没有其他版本,但要点如下:GUID需要所有部分才能确保唯一性;如果你改变了某些内容,可能会得到一个不再唯一的GUID。所以你可能更像是在生成一个GID或者其他什么东西。最安全的更改可能是当前版本4的GUID(这是Windows和.NET将生成的),因为它们并不能真正地保证唯一性,而是使其变得非常非常不太可能。
总的来说,我认为最好的方法是生成一个新的GUID。这也有助于阅读者,因为如果两个GUID看起来完全不同,你可以很容易地区分它们。如果它们只在一个数字上有所不同,人们很可能会忽略这个变化,并认为GUID是相同的。
此外,在另一个地方的另一个人可能会被迫做与你相同的事情,甚至可能是到相同的数字,这样你就会得到两个相等的GUID。考虑到在正常情况下发生碰撞的可能性(非常低),在一个大型项目中,可能会从同一个GUID派生出多个GUID,这实际上可能是碰撞的最有可能的原因。
进一步阅读:
维基百科:GUID
维基百科:UUID
Eric Lippert:GUID指南。第一部分,第二部分,第三部分。(读一下吧;这个人讲解得很好,而且也在SO上)
维基百科:MAC地址
RFC 4122:GUID版本
RFC 4122:变体字段
DCE 1.1:认证和安全服务 - 版本2 GUID的描述
Raymond Chen:GUID是全球唯一的,但GUID的子字符串不是
Raymond Chen:GUID被设计为唯一的,而不是随机的