我刚刚生成了几百万个GUID,将它们转换成字符串并获得了长度...... 它总是相同的。当将其转换为字符串时,我可以依赖这个固定长度吗?
另外,GUID的中间数字总是 "4" 吗,就像这个屏幕截图中显示的那样?
我刚刚生成了几百万个GUID,将它们转换成字符串并获得了长度...... 它总是相同的。当将其转换为字符串时,我可以依赖这个固定长度吗?
另外,GUID的中间数字总是 "4" 吗,就像这个屏幕截图中显示的那样?
是的,长度是固定的,中间的数字在使用标准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);
从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或更高的数字。
不,GUID实际上不必是类型为4的UUID,在Windows中许多GUID都是类型为1的UUID。
类型1使用主要MAC地址、时钟和序列。实际上这会"泄漏"数据,因为在同一系统上创建的所有UUID1都将具有相同的MAC地址。这就是为什么大多数GUID函数将获取这些数据并对其进行哈希处理,然后将其转换为基于哈希的UUID的原因。