Решил выложить небольшую либу для подсчета хэш-сумм (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 · #
Спасибо, пригодилось. Успехов :)