Изучение FreePascal Generics.Collections library показало, что для применения семейства хеш-функций, реализованных в библиотеке, достаточно воспользоваться классами и интерфейсами из модуля Generics.Defaults. Этот модуль требует еще трех модулей из библиотеки: Generics.Strings, Generics.Helpers, Generics.Hashes.
1. Применение интерфейсов IEqualityComparer<T> и IExtendedEqualityComparer<T>, реализованных в классе TExtendedEqualityComparer<T>
Generic интерфейс IEqualityComparer<T> предоставляет два метода:
♦ function Equals(constref ALeft, ARight: T): Boolean; — сравнение на равенстов двух элементов ALeft и ARight;
♦ function GetHashCode(constref AValue: T): UInt32; — вычисление хеш-кода для AValue.
Интерфейс IExtendedEqualityComparer<T> наследник от IEqualityComparer<T> добавляет еще один метод
♦ procedure GetHashList(constref AValue: T; AHashList: PUInt32); — вычисление нескольких хеш кодов от одного значения.
Для получения экземпляров указанных интерфейсов предназначены два класса:
TEqualityComparer<T> — предоставляет интерфейс IEqualityComparer<T>;
TExtendedEqualityComparer<T> — наследник класса TEqualityComparer<T>, предоставляющий интрерфейс IExtendedEqualityComparer<T>.
Эти классы включают следующие методы, возвращающие generic интерфейсы:
A)
♦ class function TEqualityComparer<T>.Default: IEqualityComparer<T>; static; overload;
♦ class function TExtendedEqualityComparer<T>.Default: IExtendedEqualityComparer<T>; static; overload; reintroduce;
— используются дефолтовые реализаций функций сравнения на равенство и вычисления хешей:
B)
♦ class function TEqualityComparer<T>.Default(AHashFactoryClass: THashFactoryClass): IEqualityComparer<T>; static; overload;
♦ class function TExtendedEqualityComparer<T>.Default(AExtenedHashFactoryClass: TExtendedHashFactoryClass): IExtendedEqualityComparer<T>; static; overload; reintroduce;
— используются дефолтовые реализации функций сравнения на равенство и предопределенные хешеры–наследники классов THashFactory и TExtendedHashFactory:
C)
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AHasher: THasherFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
— используются внешние функции сравнения на равенство и вычисления хешей:
D)
♦ class function TEqualityComparer<T>.Construct(const AEqualityComparison: TOnEqualityComparison<T>; const AHasher: TOnHasher<T>): IEqualityComparer<T>; overload;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TOnEqualityComparison<T>; const AHasher: TOnHasher<T>; const AExtendedHasher: TOnExtendedHasher<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TOnEqualityComparison<T>; const AExtendedHasher: TOnExtendedHasher<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AHasher: THasherFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
♦ class function TExtendedEqualityComparer<T>.Construct(const AEqualityComparison: TEqualityComparisonFunc<T>; const AExtendedHasher: TExtendedHasherFunc<T>): IExtendedEqualityComparer<T>; overload; reintroduce;
— используются методов внешних классов, реализующих функции сравнения на равенство и вычисления хешей:
Также классы TEqualityComparer<T> и TExtendedEqualityComparer<T> содержат объявления абстрактных методов интерфейсов:
♦ function Equals(constref ALeft, ARight: T): Boolean;
♦ function GetHashCode(constref AValue: T): UInt32;
♦ procedure GetHashList(constref AValue: T; AHashList: PUInt32);
которые реализуются в классах–делегатах, являющимия потомками TEqualityComparer<T> и TExtendedEqualityComparer<T>, интерфейсы этих классов–делегатов возвращаются функциями Construct.
Ниже приведен пример применения специализации интерфейса IExtendedEqualityComparer<string> с использованием в качестве хешера встроенного класса TDelphiQuadrupleHashFactory:
01 program testGCM;
02 {$mode delphi}{$H+}
03 uses
04 Classes, sysutils,
05 { you can add units after this }
06 Generics.Strings, Generics.Helpers, Generics.Hashes, Generics.Defaults,
07 MyDebug;
08
09 const
10 cUcStrR = 'АБВГДЕ';
11 cLcStrR = 'абвгде';
12
13 var
14 iExtEqu: IExtendedEqualityComparer<string>;
15 ui32: UInt32;
16 hashList: array[0..6] of UInt32;
17 begin
18 iExtEqu := TExtendedEqualityComparer<string>.Default(TDelphiQuadrupleHashFactory);
19 //hash code
20 ui32 := iExtEqu.GetHashCode(cLcStrR);
21 writeln(Format('"%s" hash code = 0x%.8x', [cLcStrR, ui32]));
22 writeln;
23
24 hashListParams := @hashList;
25 doHashList(cLcStrR, -1, 2);
26 hashListParams[0] := -1;
27 hashListParams[1] := 2;
28 //hash list
29 iExtEqu.GetHashList(HStr, @hashList);
30 writeln(Format('"%s" hash params = %d; %d', [HStr, hashListParams[0], hashListParams[1]]));
31 for i := 1 to High(hashList) do
32 writeln(Format(' -> list[%d] = 0x%.8x', [i, hashList[i]]));
33 writeln;
34
35 writeln(Format('Equals "%s" "%s" == ', [cUcStr, cUcStr]), iExtEqu.Equals(cUcStr, cUcStr));
36 writeln(Format('Equals "%s" "%s" == ', [cUcStr, cLcStr]), iExtEqu.Equals(cUcStr, cLcStr));
37
38 end.
Итоговый вывод исполнения программы имеет вид:
"абвгде" hash code = 0xD16487C4
"абвгде" hash params = -1; 2
-> list[1] = 0xD16487C4
-> list[2] = 0x00000000
…
-> list[6] = 0x00000000
Equals "ABCDEF" "ABCDEF" == TRUE
Equals "ABCDEF" "abcdef" == FALSE
Компилирование и запуск программы с включенным флагом Use Heaptrc unit показало отсутствие утечек памяти.
Продолжение:
К началу
|