Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > GUID как с ними работать


Автор: User 25.1.2005, 13:25
Наверное многим чатланам было бы интересно узнать что такое Guid и как с ним работать в Delphi. Я этим вопросом заинтересовался недавно, но литературы по нему так и не нашел. Предлогаю собрать сдесь небольшой анонс решений данной проблемы. Пишите!
Это действительно интересно многим!

Автор: <Spawn> 26.1.2005, 06:23
Вообще то этот вопрос стоило задать в ActiveX\COM\CORBA.

GUID - Global Unique IDentifier - Глобальный Уникальный Иеднтификаторsmile Это 128-разраядное значение, используемое для идентификации COM-обьектов. Генерируется на основе IP-адреса и еще каких то данных. Вероятность повторной генерации одинаковых значений ничтожна мала, точнее говоря, есле генерить GUID-ы со скоростью 1 000 000 в секунду то за время существования вселенной вероятность их повторения равна 5% smile

В Дельфи с ним работать простоsmile Если ты описываешь какой либо интерфейс, то после него указываешь GUID таким образом:

Код

 IDropTarget = interface(IUnknown)
   ['{00000122-0000-0000-C000-000000000046}']


Если нужно самому сгенерить его, то в IDE Дельфи это делается путем нажатия Ctrl+SHift+G, либо программно нужно вызвать функцию CoCreateGUID(Либо поискать на форуме - тут вроде была темка его ручной генерации smile).

Автор: Петрович 29.1.2005, 20:46
Цитата
Вообще то этот вопрос стоило задать в ActiveX\COM\CORBA.

Совсем не обязательно.
Дело в том, что GUID очень удобно для уникальной идентификации записей в БД.
Например, в MS SQL-server'е есть даже специальный тип - uniqueidentifier.

Цитата(User @ 25.1.2005, 14:25)
... собрать сдесь небольшой анонс решений данной проблемы.

А проблемы никакой и нет smile.
Как и сказал <Spawn>, просто используй функцию CreateGUID. Если нужно сгененрировать GUID на MS SQL-сервере, то испоьзуй функцию NEWID().

Вот пример как я "генерю" значение идентификатора для новых записей:
Код

function GetNewRecordID :Variant;
var  GUID :tGUID;
begin
 CheckOSError(CreateGUID(GUID)=0,'Ошибка генерации GUID!');
 Result := GUIDToString(GUID);
end;

Автор: Vit 30.1.2005, 06:45
Последнее время использую их всё чаще и чаще... Очень удобно иметь 100% уникальную строку, практически везде - от баз данных, до уникального имени файла. Везде где надо гарантировать неповторяемость строки использую GUID. Например:
1) при автоматической рассылке email вставляю GUID в заголовок письма как его идентификатор, если клиент звонит с проблемой - по этому GUID я точно идентифицирую что за транзакция была где и когда.
2) Есть система в которой информация передаётся файлами от компа к другому - для уникальности имени использую GUID в качестве имени файла
3) Как ключи в таблице -чтоб не мучится с уникальностью, особенно если есть репликация данных
4) MD5 в результате тоже выдаёт 16 байт, как и GUID - широкое поле деятельности для шифрования...
5) Ну для COM уже говорили
6) Для клиентов при установке приложения из очень многих файлов надо обеспечить совместимость версий и т.п. Кто работал тот знает какую кашу может сотворить продвинутый пользователь тщательно перемешав файлы от разных версий продукта у себя, а потом лезут ошибки которые распутать подчас бывает очень сложно. Поэтому в базу данных кладём табличку или SP с GUID и по нему программа проверяет версию базы данных, в каждую DLL кладём по GUID'у который врзвращается в ответ на какую-нибудь функцтю, к исполняемым файлам можно подшить в ресурсы и т.п. Если аккуратно сделать и эти идентификаторы тщательно запрятать, то клиенту очень сложно будет вручную перемешать файлы, базы данных и т.п. - система безошибочно найдёт все неверные версии а не будет вылетать по малопонятным ошибкам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)