Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > GOST HASH выдает разные результаты при хешировании


Автор: ekianu 7.8.2009, 15:26
Привет.
Написал 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. Какой метод правильный?

Автор: CodeMonkey 7.8.2009, 18:12
Цитата(ekianu @  7.8.2009,  15:26 Найти цитируемый пост)
Какой метод правильный? 

Недостаточно информации, сказать невозможно.

Лично мне удивительно, что у вас хоть как-то работает (на маленьких файлах).

Потому что в одном случае вы передаёте указатель на данные:

Код
    gosthash_update(ctx, ViewPointer, GetFileSize(FileHandle, nil));


А во втором - сами данные непосредственно:

Код
    gosthash_update(ctx, buf, bytesRead);


По-хорошему, должно быть или:

Код
    gosthash_update(ctx, ViewPointer, GetFileSize(FileHandle, nil));
...
    gosthash_update(ctx, @buf, bytesRead);


или:

Код
    gosthash_update(ctx, ViewPointer^, GetFileSize(FileHandle, nil));
...
    gosthash_update(ctx, buf, bytesRead);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)