Решил выложить небольшую либу для подсчета хэш-сумм (MD2, MD4, MD5, SHA, CRC32) блока памяти и файлов. Её целью не является достичь максимального быстродействия, а скорее достичь компактности кода – минимизация за счет использования библиотеки CryptoAPI.
Весь код либы я тут выкладывать не буду, она доступна для скачки ниже, а лишь поясню как и чего =)
Функция возвращающая хэш сумму для блока памяти:
function GetHash(Data: Pointer; var nSize: Cardinal; HashType: THashType): Pointer;
Data [in] – указатель на буфер, для которого высчитывается хэш сумма;
nSize [in,out] – размер буфера с данными, после выполнения функции, данной переменной присваивается размер данных хэш суммы;
HashType [in] – тип высчитываемой хэш суммы (MD2, MD4, MD5, SHA1, CRC32).
Вывод хэш суммы в текстовом формате:
function BinToHexStr(Bin: Pointer; nSize: Cardinal): String;
Bin [in] – указатель на буфер с полученной хэш суммой;
nSize [in] – размер буфера с хэш суммой.
Функция возвращающая хэш сумму для файла:
function FileToHash(const FileName: String; var dwSize: Cardinal; HashType: THashType): Pointer;
FileName [in] – имя файла, для которого высчитывается хэш сумма;
dwSize [out] – данной переменной присваивается размер данных хэш суммы;
HashType [in] – тип высчитываемой хэш суммы (MD2, MD4, MD5, SHA1, CRC32).
Пару примерчиков:
Для строки (блока памяти):
procedure TForm1.Button1Click(Sender: TObject);
var
digest: Pointer;
dwSize: Cardinal;
Str: String;
begin
Str:= 'bla-bla-bla';
dwSize:= Length(Str);
digest:= GetHash(@Str[1], dwSize, ALG_MD5);
if digest <> nil then try
Str:= BinToHexStr(digest, dwSize);
ShowMessage(Str);
finally
FreeMem(digest);
end;
end;
Для файла:
procedure TForm1.Button1Click(Sender: TObject);
var
digest: Pointer;
dwSize: Cardinal;
Str: String;
begin
Str:= 'c:\test.txt';
digest:= FileToHash(Str, dwSize, ALG_MD5);
if digest <> nil then try
Str:= BinToHexStr(digest, dwSize);
ShowMessage(Str);
finally
FreeMem(digest);
end;
end;

— Dmitriy · 7 Январь 2011, 13:48 · #
Спасибо, пригодилось. Успехов :)