Как программно сгенерировать GUID (char 22)

Автор AHTOH, 18.11.14, 21:50:16

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

AHTOH

В справочниках УТС после добавления создаются записи, у которых есть поле GUID. В MS SQL поле GUID описывается так: char(22) Необходимо дополнить справочник записями из сторонней БД. С добавлением обычных полей проблем нет. Но как программно сгенерировать GUID размером char(22) ?

Golovanev

А погуглить.... если...

На Delphi

Uses
SysUtils;

var
  MyGUID : TGUID;
  stGUID : String;

begin
...
CreateGUID(MyGUID);
stGUID := Copy(GUIDToString(MyGUID),1,21)+'}';
ShowMessage(stGUID);
...
+ Благодарностей: 1

AHTOH

Спасибо!

С   CreateGUID(MyGUID); и у меня проблем не было, меня больше скобки {} смущали, в голове не укладывались, хотя без них в Delphi выходило 4+4+12 = 20 байт и, по логике, вроде как еще скобки спереди и сзади добавлялись.
К тому же, в УТС не нашел ни одного элемента GUID,  который бы начинался или заканчивался фигурными скобками...

AHTOH

Поспешил я с выводами
stGUID := Copy(GUIDToString(MyGUID),1,21)+'}'; - не совсем то, что мне нужно.
В указанной выше строке просто обрезаются лишние символы. Предполагаю, что из-за этого нарушается уникальность.

Вообще, сдается мне, что Delphi-GUID вида {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}, где  x-16-ричное число
в Асконе как-то преобразуется или отображается как GUID формата xxxxxxxxxxxxxxxxxxxxxx,где x-буква  латинского алфавита в любом регистре или цифра 0-9 или точка. Итого возможно 64 варианта для каждого  из 22 символов.
Т.е. вопрос такой: как Аскон 32 16-ричных символа преобразует в 22 64-ричных символа?

Как реализовать подобный перевод в DELPHI???

AHTOH

В общем первоначальный вопрос мой перефразировался в такой:

Как GUID (из 38 символов) перевести в UUID (char из 22 символов) ?

nnspu

02.12.14, 13:26:16 #5 Последнее редактирование: 02.12.14, 13:45:46 от nnspu
В базе УТС есть скалярная функция dbo.fnGetNewGUID(), которая генерирует новый GUID для объектов УТС
Во всяком случае так в MSSQL

Пример конвертации GUID в 22 символьный вариант на c#:

public static string Encode(Guid guid)
{
   string encoded = Convert.ToBase64String(guid.ToByteArray());
   encoded = encoded
.Replace("/", "_")
.Replace("+", "-");
   return encoded.Substring(0, 22);
}

public static Guid Decode(string value)
{
   value = value
.Replace("_", "/")
.Replace("-", "+");
   byte[] buffer = Convert.FromBase64String(value + "==");
   return new Guid(buffer);
}

AHTOH

Никак не могу я найти в MS SQL в базе  УТС скалярную функцию dbo.fnGetNewGUID()
Она точно так называется? Ни такого названия, ни чего-то подобного я не вижу ни в скалярных, ни в прочих функциях. Может, секрет какой есть?

AHTOH

А все-таки, может кто знает  API-функцию в Вертикали/в УТС, которая генерирует GUID ?
Обыскал всю папку SDK, и в программных файлах искал, и в документации, ничего не нашел.

Единственное, что попадалось - как сменить GUID. Парамтерами необходимо задавать старый и новый GUID. Но как его  (новый GUID)  программно сформировать - не говорится...

oit

Интерфейс IGlobalVrsCOM метод GetGUID22