给定一个整数,如何可以重复创建相同的Guid?
编辑:
我正在集成两个系统,其中一个使用整数作为主键,另一个通过Guid识别对象。因此,我需要能够为给定的整数重新创建相同的Guid,以便第二个系统可以识别来自第一个系统的实体。
如果你基于一个整数创建Guid,则它将不再是全局唯一标识符。
尽管如此,你仍然可以使用带有整数和其他参数的构造函数:
int a = 5;
Guid guid = new Guid(a, 0, 0, new byte[8]);
不是很建议这样做...
这是使用版本3或版本5 guid的完美场景。
guid有五种类型:
版本3和版本5旨在将任意的“name”始终映射到相同的“guid”。
这个想法是取一个任意的“name”和一个“namespace”,对它们进行哈希,并将哈希值“carefully”存储在guid结构中,概念上如下:
"CustomersTable" + "1" -> sha1() -> Guid
"CustomersTable" + "2" -> sha1() -> Guid
通过使用"命名空间"前缀来避免相同"名称"的冲突:
"InvoicesTable" + "1" -> sha1() -> Guid
"InvoicesTable" + "2" -> sha1() -> Guid
除了 "namespace" 是字符串外,它还需要指定为GUID:
Namespace_Customer = '{277D668B-264A-433E-9EEB-867C02C6D48D}';
Namespace_Invoice = '{D8024CFB-D6F8-4DB2-9135-96FD0A7B97AB}';
RFC定义了四个预定义的命名空间uuid:
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}';
hex: 00010203040506070809101112131415
它们被映射到uuid结构中:
timeLow = 00 01 02 03
timeMid = 04 05
timeHighAndVersion = ((06 07) & 0x0FFF) | (0x5000) //high 4-bits are version, 5=SHA1, 3=MD5
clockSeqHiAndReserved = (08 & 0x3F) | 0xD0 //set high bits to 10
clockSeqLow = 09
node = 10 11 12 13 14 15
将您的客户和发票运行通过我的NameToGuid
函数,得到如下结果:
NameToGUIDA(Namespace_Customer, "1") = {7E378BDB-5BB1-5EBF-9C63-E00AC1AEEDB7}
NameToGUIDA(Namespace_Customer, "2") = {830F19D8-D5DC-5321-8CF9-D708660BE473}
NameToGUIDA(Namespace_Customer, "10") = {C052F6ED-0334-5827-B077-7F4C28B78223}
NameToGUIDA(Namespace_Invoice, "1") = {BB5408DA-B99C-5816-B144-A63CC02BB21C}
NameToGUIDA(Namespace_Invoice, "2") = {73DDD3B3-1139-50C8-9B0D-067145611346}
NameToGUIDA(Namespace_Invoice, "10") = {AE1799A8-620F-55DB-AC85-D7056B70AFB5}
如果你希望 GUID 仅由整数组成,则:
int x = 5;
string padded = x.ToString().PadLeft(32,'0');
var intGuid = new Guid(padded);
intGuid.ToString(); // 00000000-0000-0000-0000-000000000005
您可以将int64转换为byte[],并使用构造函数重载来实现:
var guid = new Guid(byteArray);
编辑--哎呀...它基于128位,而不是64位。如果您有一个自定义类型MyBigInt(一个128位整数),则可以按照上述方式执行。