第3类和第5类UUID仅是将散列值(hash)嵌入UUID中的一种技术:
- 第1类:将MAC地址+日期时间填入128位
- 第3类:将MD5散列值填入128位
- 第4类:将随机数据填入128位
- 第5类:将SHA1散列值填入128位
- 第6类:用于生成顺序UUID的非官方想法
编辑:非官方的第6类现在有一个官方rfc文档
SHA1散列值输出160位(20个字节);将散列结果转换为UUID。
以20字节的SHA1摘要为例:
SHA1 Digest: 74738ff5 5367 e958 1aee 98fffdcd1876 94028007
UUID (v5): 74738ff5-5367-5958-9aee-98fffdcd1876
⭡ ⬑first two bits set to 1 and 0, respectively
╰─low nibble is set to 5, to indicate type 5
我应该哈希什么?
您可能想知道我应该哈希什么。基本上,您需要哈希以下内容的连接:
sha1(NamespaceUUID+AnyString);
您需要在字符串前加上所谓的命名空间以防止名称冲突。
UUID RFC为您预定义了四个命名空间:
NameSpace_DNS
: {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
NameSpace_URL
: {6ba7b811-9dad-11d1-80b4-00c04fd430c8}
NameSpace_OID
: {6ba7b812-9dad-11d1-80b4-00c04fd430c8}
NameSpace_X500
:{6ba7b814-9dad-11d1-80b4-00c04fd430c8}
因此,您可以将其组合起来进行哈希:
StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com")
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com")
RFC文档随后定义如何:
- 从SHA1中取出160位
- 将其转换为UUID的128位
基本思路是只取前128位,在类型记录中插入一个5
,然后将clock_seq_hi_and_reserved
部分的第一二位分别设置为1和0。
更多示例
现在你有一个生成所谓Name的函数,你可以编写函数(伪代���):
UUID NameToUUID(UUID NamespaceUUID, String Name)
{
Byte[] hash = sha1(NamespaceUUID.ToBytes() + Name.ToBytes());
Uuid result;
Copy(hash, result, 16);
result[6] &= 0x0F;
result[6] |= 0x50;
result[8] &= 0x3F;
result[8] |= 0x80;
return result;
}
(Note:您系统的字节序可能会影响上述字节的索引)
现在您可以进行调用:
uuid = NameToUUID(Namespace_DNS, 'www.stackoverflow.com');
uuid = NameToUUID(Namespace_DNS, 'www.google.com');
uuid = NameToUUID(Namespace_URL, 'http://www.stackoverflow.com');
uuid = NameToUUID(Namespace_URL, 'http://www.google.com/search&q=rfc+4112');
uuid = NameToUUID(Namespace_URL, 'https://dev59.com/11XTa4cB1Zd3GeqP5M1U');
现在回答你的问题
对于版本3和版本5的UUID,还需要提供额外的命令行参数namespace和name。namespace可以是字符串表示的UUID,也可以是内部预定义命名空间UUID的标识符(目前已知的有“ns:DNS”、“ns:URL”、“ns:OID”和“ns:X500”)。name是任意长度的字符串。
namespace可以是你喜欢的任何UUID。它可以是预定义的其中之一,也可以是您自己定义的,例如:1:
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
名称是任意长度的字符串。
名称只是您希望附加到命名空间的文本,然后将其散列化并填充到UUID中:
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'screwdriver');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'toothbrush');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'broomstick');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'orange');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'axe handle');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'impulse body spray');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'iPod Touch');