从int创建一个Guid

给定一个int ,你怎么能反复创建同一个Guid?

编辑:
我正在集成两个系统,一个使用int作为主键,另一个通过它的Guid识别一个对象。 因此,我需要能够为给定的int重新创建相同的Guid,以便第二个系统可以识别来自第一个的实体。

如果您基于整数创建Guid,它将不再是全局唯一标识符。

说过你可以使用带整数和其他一些参数的构造函数:

 int a = 5; Guid guid = new Guid(a, 0, 0, new byte[8]); 

不太可取……

这是版本3版本5指南的完美用法。

有五种指南:

  • 1:基于时间的版本(UuidCreateSequential)
  • 2:DCE安全版,带有嵌入式POSIX UID
  • 3:使用MD5散列的基于名称的版本
  • 4:随机或伪随机生成的版本(UuidCreate)
  • 5:使用SHA-1散列的基于名称的版本

版本3和版本5旨在使任意名称始终映射到相同的guid

我们的想法是采用任意“ 名称 ”和“ 命名空间 ”,对它们进行哈希处理,并且在概念上将哈希小心地存储在guid结构中:

 "CustomersTable" + "1" -> sha1() -> Guid "CustomersTable" + "2" -> sha1() -> Guid 

您可以通过在“命名空间 ”前添加前缀来避免相同“名称”的冲突:

 "InvoicesTable" + "1" -> sha1() -> Guid "InvoicesTable" + "2" -> sha1() -> Guid 

除了“命名空间”是一个字符串,它被指定为一个guid:

 Namespace_Customer = '{277D668B-264A-433E-9EEB-867C02C6D48D}'; Namespace_Invoice = '{D8024CFB-D6F8-4DB2-9135-96FD0A7B97AB}'; 

RFC提供了四个预定义的名称空间uuids:

 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}'; 

rfc描述了如何将哈希的16个字节放入guid结构中。 如果哈希的前16个字节是:

 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 

通过我的NameToGuidfunction运行客户和发票给出:

 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那么:

 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); 

编辑 – oops ..它基于128位,而不是64位。如果你有一个自定义类型,MyBigInt(128位int),那么你可以按照上述方式进行。