C# 从int创建Guid

C# 从int创建Guid,c#,guid,C#,Guid,给定一个int,如何重复创建相同的Guid 编辑: 我正在集成两个系统,一个使用ints作为主键,另一个通过Guid识别对象。因此,我需要能够为给定的int重新创建相同的Guid,以便第二个系统能够识别来自第一个int的实体。您可以将int64转换为byte[],并使用构造函数重载来执行此操作: var guid = new Guid(byteArray); 编辑--oops。。它基于128位,而不是64位。。如果您有一个自定义类型MyBigInt(128位int),那么您可以用前面提到的方法

给定一个
int
,如何重复创建相同的Guid

编辑:

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

您可以将int64转换为byte[],并使用构造函数重载来执行此操作:

var guid = new Guid(byteArray);

编辑--oops。。它基于128位,而不是64位。。如果您有一个自定义类型MyBigInt(128位int),那么您可以用前面提到的方法来实现它。

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

如上所述,您可以使用接受整数和其他一些参数的构造函数:

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

不太可取…

如果希望guid仅由int组成,则:

int x = 5;
string padded = x.ToString().PadLeft(32,'0');
var intGuid = new Guid(padded);

intGuid.ToString(); // 00000000-0000-0000-0000-000000000005

这是版本3版本5guid的完美使用

有五种GUI:

  • 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
通过使用“名称空间”作为前缀,可以避免相同“名称”的冲突:

除了“名称空间”不是字符串之外,它被指定为guid:

Namespace_Customer = '{277D668B-264A-433E-9EEB-867C02C6D48D}';
Namespace_Invoice =  '{D8024CFB-D6F8-4DB2-9135-96FD0A7B97AB}';
名称空间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}';
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
通过my
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相关吗?这是为了测试什么吗?您必须让我们知道您更喜欢哪个系统。工作非常完美,Guid的不同元素也允许我区分不同的实体类型。谢谢Bradley Grainger发布了一个C#实现
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}