![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сравнить два GUID? [D7, XP]
Darvin © (2007-09-12 13:37:00)Здравствуйте.
Как можно выполнить следующее:
var<- Ошибка несовместимости типов
G1, G2 : TGUID;
begin
...
if G1 = G2 then ...
Ошибка понятна TGUID - структура, а их сравнивать нельзя.
Я вышел из положения следующим способом:
if GUIDToString(G1) = GUIDToString(G2) then ...
Но корректно ли так сравнивать два GUID?
Ega23 (2007-09-12 14:37:00) [1]
> Сергей М. © (12.09.07 14:32) [10]
Спасибо за пояснения. Возьму на вооружение.
Darvin (2007-09-12 14:34:00) [2]>Сергей М. © (12.09.07 14:32) [10]
ясно, учту, спасибо
Сергей М. (2007-09-12 14:32:00) [3]С т.з. генерируемого компилятором машкода мой код приводит максимум к 4-м операциям сравнения при незначительных накл.расходах на подготовку к этим сравнениям.
CompareMem использует строковую инструкцию rep cmpsd, которая тоже не менее эффективна, но накл.расходы на подготовку к выполнению этой инструкции сводят на нет ее преимущества - любая "универсальность" (а ф-ция CompareMem реализована как универсальная для любых типов данных любого размера) часто, если не сказать всегда, наносит ущерб эффективности в конкретном ее применении.
Darvin (2007-09-12 14:26:00) [4]Я пока остановился на варианте [3], учитывая критерий оптимальность / простота кода, но проверить пока не могу, проект не компилится по не связанным с сабжем причинам. Доработаю, буду пробовать.
Ega23 (2007-09-12 14:16:00) [5]
> Я лишь предложил один из возможных вариантов с т.з. простоты
> и эффективности.
Не, просто как-то понадобилось их (ГУИДы) сравнивать, причём не на TSQL (там проще). Тогда мне показалось, что данный способ [3] наиболее быстр, чем распихивать ГУИД по его структуре и сравнивать отдельные поля.
Поправь меня, если я не прав.
Сергей М. (2007-09-12 14:09:00) [6]
> Ega23 © (12.09.07 14:01) [6]
А я про проблемы и не говорил.
Я лишь предложил один из возможных вариантов с т.з. простоты и эффективности.
Ega23 (2007-09-12 14:01:00) [7]
> Сергей М. © (12.09.07 13:59) [5]
а как в [3] - разве могут проблемы возникнуть?
Сергей М. (2007-09-12 13:59:00) [8]
> корректно ли так сравнивать два GUID?
Корректно, но в ряде случаев неэффективно.
Как вариант можно поступить так:
type
TGUIDStruct = packed record
case Integer of
0: (Native: TGUID);
1: (Int64Array: array[0..1] of Int64);
end;
var
G1, G2 : TGUID;
G1s: TGUIDStruct absolute G1;
G2s: TGUIDStruct absolute G2;
..
Result := (G1s.Int64Array[0] = G2s.Int64Array[0]) and (G1s.Int64Array[1] = G2s.Int64Array[1]); //True, если равны
Darvin (2007-09-12 13:46:00) [9]всем спасибо!
Ega23 (2007-09-12 13:43:00) [10]
function GuidCompare(Val1, Val2: TGUID): Boolean;
begin
Result := CompareMem(@Val1, @Val2, SizeOf(TGUID));
end;
clickmaker (2007-09-12 13:42:00) [11]ну для надежности можно там
if SameText(G1, G2) then ...
но сравнивать строки всегда дольше
можно написать свою, сравнивать поля структуры
или IsEqualGUID из ole32
Вася Правильный (2007-09-12 13:39:00) [12]если структура, что мешает сравнить ее попольно?
и следать для этогофункцию при многоразовом использовании