Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > расчет CRC(контрольной суммы) для Record


Автор: Flashboy 24.3.2011, 14:14
Суть задачи в том что существует массив записей,
необходимо посчитать контрольную сумму(CRC32 к примеру) каждой записи и записать в отдельный массив.
В моем случае проблема выходит такая, что при расчете совершенно одинаковых записей(по значению) CRC32 хэш получается разный.
Код

type
TFInfoRec = Record
      Name: String;
      Size: Cardinal;
      LastAcc: TDateTime;
      Hash: String[8];
   Public
       Constructor SetValues(Const FName: String; Const FSize: Int64; Const FDateTime: TDateTime; Const FHash: ShortString);//
   End;
var
MassRec: Array[0..10000] Of TFInfoRec;
HashArr:Array[0..10000] Of String[8];
Implementation
Constructor TFInfoRec.SetValues(Const FName: String; Const FSize: Int64; Const FDateTime: TDateTime; Const FHash: ShortString);
Begin
   Self.Name := FName;
   Self.Size := FSize;
   Self.LastAcc := FDateTime;
   Self.Hash := FHash;
End;
//...
//...
Procedure Calculate;
Var 
i:Integer;
TD:TDateTime;
begin
TD:=Now;
for i:=0 to 10000 do
begin
MassRec[i].SetValues('Nicola Tesla',256,TD,'FDE2FFAA');
HashArr[i]:=IntToHex(GetCRC32(MassRec[i],SizeOf(MassRec[i])));
end;
end;

Каким образом верно рассчитать контрольную сумму CRC32 для Record, может быть кто-то сталкивался?
GetCRC32() использовался различный, возможно неверно.

Автор: cat512 24.3.2011, 16:46
Ну проверить то просто! Если GetCrc32 возвращает разный хэш от константной строки, то значит проблема в GetCrc32, если нет то проблшема с реализацией алгоритма

Добавлено @ 16:55
На сколько я помню в Crc32 хэш 4-х байтный, и входной параметр буфера должен быть 4-х байтный.
А у тебя запись более 16 байт. Далее, в записи у тебя параметр указатель на строку, который при каждом перераспределении памяти будет иметь разное значение! поэтому у тебя и Хэш разный

Добавлено @ 16:59
Замени Name: string и hash: string, на array [0..MaxValue] of char; В этом варианте, память расходуется не эффективно, но зато работать будет корректно!

Автор: Flashboy 24.3.2011, 17:01
Проблема оказалось вот в чем:
1. Структура содержала Constructor
2. элемент структуры  Name: String; - строка неопределенной величины.

После таких изменений все заработало:
Код

type
TFInfoRec = Record
      Name: ShortString; //Изменили String на ограниченную до 255 символов ShortString
      Size: Cardinal;
      LastAcc: TDateTime;
      Hash: String[8];
   Public
       Procedure SetValues(Const FName: String; Const FSize: Int64; Const FDateTime: TDateTime; Const FHash: ShortString);//Конструктор был заменен на процедуру
   End;
//..............
//.................
Implementation
Procedure TFInfoRec.SetValues(Const FName: String; Const FSize: Int64; Const FDateTime: TDateTime; Const FHash: ShortString);
Begin
   Self.Name := FName;
   Self.Size := FSize;
   Self.LastAcc := FDateTime;
   Self.Hash := FHash;
End


Автор: Flashboy 24.3.2011, 17:29
cat512, спасибо. Сам пришел к тому же только другим путем.

Автор: cat512 24.3.2011, 17:39
Cheers!  smile 

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