Привет. Написал 2 функции хеширования (ГОСТ) файлов.
| Код | const ALGOSIZE=8; ULSIZE = sizeof(Cardinal); ALGOBYTESIZE = ALGOSIZE*ULSIZE; MAXBYTE = $FF; type TUL8Array = array[0..ALGOSIZE-1] of Cardinal;
function gosthash_file(filename: String): TUL8Array; var FileHandle: THandle; MapHandle: THandle; ViewPointer: pointer; ctx:TGostHashCtx; begin gosthash_reset(ctx); gosthash_init; FileHandle := CreateFile(pChar(filename), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0); if FileHandle <> INVALID_HANDLE_VALUE then try MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil); if MapHandle <> 0 then try ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0); if ViewPointer <> nil then try gosthash_update(ctx, ViewPointer, GetFileSize(FileHandle, nil)); finally UnmapViewOfFile(ViewPointer); end; finally CloseHandle(MapHandle); end; finally CloseHandle(FileHandle); end; Result := gosthash_final(ctx); end;
function gosthash_file2(filename: String): TUL8Array; const buf_size = 4096; var FileHandle: THandle; ctx: TGostHashCtx; bytesRead: Cardinal; buf: array[0..buf_size-1] of Char; begin ZeroMemory(@Result, sizeof(TUL8Array)); FileHandle := CreateFile(pChar(filename), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0); if FileHandle <> INVALID_HANDLE_VALUE then begin gosthash_reset(ctx); gosthash_init; try repeat if ReadFile(FileHandle, buf, buf_size, bytesRead, nil) then gosthash_update(ctx, buf, bytesRead); until buf_size<>bytesRead; finally CloseHandle(FileHandle); end; Result := gosthash_final(ctx); end; end;
|
gost_update из стандартной библиотеки ГОСТ. Обе функции в маленьких файлах выдает одинаковый результат. а в файлах больше 100 МБ выдает разные результаты. Так как файлы большие не могу проверить их online. Какой метод правильный? |