Подтвердить что ты не робот

Создание указателя из int

Учитывая int, как вы можете повторно создать один и тот же Guid?

Edit:
Я интегрирую две системы, один использует ints в качестве первичного ключа, другой распознает объект по нему Guid. Из-за этого мне нужно иметь возможность воссоздать один и тот же Guid для заданного int, чтобы вторая система могла распознавать объекты, исходящие из первого.

4b9b3361

Ответ 1

Если вы создаете Guid на основе целого числа, он больше не будет глобально уникальным идентификатором.

Сказав, что вы можете использовать конструктор, который принимает целое число и некоторые другие параметры:

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

Не рекомендуется...

Ответ 2

Это идеальное использование для версии 3 или версии 5.

Существует пять видов команд:

  • 1: временная версия (UuidCreateSequential)
  • 2: версия безопасности DCE со встроенными идентификаторами POSIX
  • 3: версия на основе имени, использующая хеширование MD5
  • 4: произвольно или псевдослучайно сгенерированная версия (UuidCreate)
  • 5: версия на основе имени, использующая хеширование SHA-1

Версия 3 и версия 5 предназначены для того, чтобы произвольное имя всегда отображалось на один и тот же guid.

Идея состоит в том, чтобы взять произвольное "имя" и "пространство имен", хешировать их, а хэш тщательно хранится в структуре направляющих, концептуально:

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

Вы избегаете столкновений одного и того же "имени" путем префикса "пространства имен":

"InvoicesTable" + "1"   -> sha1() -> Guid
"InvoicesTable" + "2"   -> sha1() -> 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

Запуск ваших клиентов и счетов-фактур через мою функцию 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}

Ответ 3

Если вы хотите, чтобы guid состоял только из int, тогда:

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

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

Ответ 4

Вы можете преобразовать int64 в байт [] и использовать перегрузку конструктора, чтобы сделать это:

var guid = new Guid(byteArray);

Edit - oops.. Он основан на 128 бит, а не на 64. Если у вас есть собственный тип MyBigInt (128-битный int), то вы можете сделать это вышеупомянутым способом.