GUID可以有多短?

21

我知道标准GUID。它们可以变短吗?这背后的理论是什么?

6个回答

26

Greg Dean的答案是正确的,但为了理解GUID是如何生成的以及为什么不应缩短它,我强烈建议您阅读下面的文章。

The Old New Thing: GUIDs是全局唯一的,但GUID的子字符串不是:

一个客户需要生成一个8字节的唯一值,他们最初的想法是生成一个GUID并丢弃后半部分,只保留前8个字节。他们想知道这是否是一个好主意。

不,这不是一个好主意。

GUID生成算法依赖于它具有所有16个字节来确立唯一性,如果你扔掉其中一半,就会失去唯一性。


3
如果所需的是不到数十亿个“统计上独特”的值(根据我在答案中提到的sqrt-N经验法则),那么XOR两个半部分实际上可能是可以的(不会比随机生成8个字节更糟)。 - Alex Martelli
1
+1 我不确定为什么会有人踩,这是非常正确的(我之前也经历过)。 - Zifre
2
显然,对于这个问题的所有回答都在遭受负评——可能有人真的不喜欢 GUIDs,或者其他什么原因;-)。 - Alex Martelli

13

根据你的应用程序,这实际上取决于你的应用程序中有多大的“G”(全局)。

“GUID”代表全局唯一标识符。典型的现代“通用”GUID适用于任何应用程序,它们的“G”,也就是“全局”,确实是全球性的。跨应用程序、国家、地理位置等所有范围。16个字节是很多的信息。

如果在你的应用程序中,“G”并不是那么重要,如果你没有期望或意图让“G”在全球范围内成为全局意义上的东西,而只是在应用空间意义上的“全局”,那么你可以将大小缩小到你的应用程序范围内。

你的公司有4个部门,永远不会再增加了?2位 - 0、1、2、3是足够大的一个“GUID”来完成这项任务。显然,这是一个虚构的应用程序。

我们过去已经通过Y2K问题了解到“限制比特”的后果。因此,“比特很便宜”是不限制GUID大小,并且在现在端错误方面犯错误的一个合理理由。但事实是,许多应用程序仅仅是受限的,可能会产生大量的数据,或者带宽受限,使用16字节GUID对性能和资源产生影响是没有必要的。

因此,了解GUID的概念以及其如何适用于你的应用程序是很重要的。然后你就可以使它任何大小。


7

5
"据称全球唯一"的ID越短,当它们被随机生成时,碰撞的几率就越高。而且,由于“生日悖论”的存在,这种几率可能比你想象的要高...请参见http://betterexplained.com/articles/understanding-the-birthday-paradox/。作为一个(非常粗略但有用的)经验法则,如果(在N个可能的UID中)你分配了大约sqrt(N)左右,那么几率是不可忽略的。因此,即使对于数十亿个ID,128位的ID也相对安全;但是,如果将其缩短到32位,即使只有几万个ID,也会有相当大的碰撞风险。"

3

它们恰好为16个字节。

从技术上讲,缩短GUID的效果将根据用于生成GUID的算法而异。考虑到您使用的API(可能)不保证特定版本或实现,缩短GUID是一个坏主意。即使它确实保证了,这也是一个坏主意。如果您需要少于16个字节的熵,则应该不使用GUID。

欲了解更多信息,请参阅: http://en.wikipedia.org/wiki/Globally_Unique_Identifier


0
简单来说,GUID是保证唯一性的,因为它们就像坐标一样。
传统上,一半是特定于机器的(通过使用MAC地址),另一半是从时间派生的。
因为MAC在机器之间是唯一的,并且每台机器一次只能执行一条指令(传统上是这样记住的!),所以GUID肯定是唯一的。
然而,这意味着,如果您放弃GUID的任何部分,您将失去唯一性的保证。Martelli先生对为什么这比您想象的更成问题给出了很好的解释。
我说“传统”,但我从未阅读过表明有重大变化的文章。我认为现在不再使用实际的MAC(出于安全原因),但我认为它们仍然是基于MAC或至少是机器特定的。

2
仅限V1 GUID是坐标(MAC+时间),即使这些也不能“保证唯一”。 - Greg Dean
1
不是我点了踩,但“每台机器一次只能执行一条指令”也不是GUID可能或不可能唯一的原因。 - ChrisW
http://en.wikipedia.org/wiki/Universally_Unique_Identifier#Version_4_.28random.29 - Greg Dean
谢谢大家,我真应该去查一下维基百科的。 - Tom Wright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接