GUID的问题:它们的长度是否总是固定的,并且中间的数字是否总是4?

16

我刚刚生成了几百万个GUID,将它们转换成字符串并获得了长度...... 它总是相同的。当将其转换为字符串时,我可以依赖这个固定长度吗?

另外,GUID的中间数字总是 "4" 吗,就像这个屏幕截图中显示的那样?

alt text


你只能依赖规范中关于GUID的说明。如果规范没有提到固定长度的字符串表示,那就不要依赖它。 - Keith Randall
1
@Keith - 8-4-4-4-12 格式是标准,在微软和 OSF 中都是如此。微软文档中说 Guid.ToString() 的值格式如下: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 - Jim L
3个回答

13

是的,长度是固定的,中间的数字在使用标准tostring格式时始终为4。 GUID(在Windows以外的地方通常称为UUID)中的某些位被固定为指示版本等内容。

http://en.wikipedia.org/wiki/Uuid

编辑 我应该补充说明,"4"仅适用于根据Guid.NewGuid算法在.NET中实现的生成的Guid。没有任何阻止您将任意byte[16]转换为Guid。因此,您只能在.Net中当前算法的实现中使用4。如果您从另一个源获取Guid,则不能保证4的存在。.Net的更新或可能是Windows(取决于.Net使用自己的还是Windows的生成器)的更新可能会更改GUID的固定数字。

例如,以下是完全工作的代码,并且不会在位置上有4:

        var rand = new Random();
        var byteArray = new byte[16];
        rand.NextBytes(byteArray);
        var g = new Guid(byteArray);

2
4 是版本号。它取决于它是如何生成的,而不是你将其转换为字符串的方式。 - Gabe
1
如果您将GUID显示为十进制数,那么该位置上不一定会有数字4。请注意,这样做是疯狂的,只是您可以这样做。 - mjfgates
1
@Gabe - 缩短字符串长度的一个半常见技巧是进行 base 64 转换,这种情况下字符串中的 4 不会出现在固定位置上,而是掩盖了固定值。例如:Convert.ToBase64String(guid.ToByteArray()); - Jim L
@Jim Leonardo - Base64 GUID的长度是否始终相同? - makerofthings7
MakerOfThings7:GUID 的定义是 128 位。任何合理的将其转换为字符串的算法都会生成相同长度的字符串。 - Gabe
@Maker - GUID始终是16个字节,因此字节数组为byte [16],因此我不明白Guid.ToByteArray的ToBase64String长度如何改变。 - Jim L

5

Guid.ToString的文档(不带参数):

此Guid的值格式化为 如下: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 其中GUID的值 表示为一系列小写字母 十六进制数字,分组为8、4、4、4和12个数字,并用连字符分隔。返回值的示例是“382c74c3-721d-4f34-80e5-57657b6cbc27”。

所以答案是“是”,它将始终具有相同的长度。

至于4,它是一个版本号(根据http://en.wikipedia.org/wiki/Uuid)。使用该算法生成的每个GUID在该位置上都将具有4,但旧的GUID将具有1、2或3。未来的GUID可能会有5或更高的数字。


3

不,GUID实际上不必是类型为4的UUID,在Windows中许多GUID都是类型为1的UUID。

类型1使用主要MAC地址、时钟和序列。实际上这会"泄漏"数据,因为在同一系统上创建的所有UUID1都将具有相同的MAC地址。这就是为什么大多数GUID函数将获取这些数据并对其进行哈希处理,然后将其转换为基于哈希的UUID的原因。


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