Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Подсчет контрольной суммы файлов. Новая функция!   Найти похожие ветки 

 
Изобретатель ©   (2005-10-28 10:57) [0]

В результате мучительных экспериментов придумал вот такую простую, но надеждную (я надеюсь) функцию для подсчета контрольной суммы файлов. Отцените.


function GetCheckSum (const FileName: String; nBytesToRead: DWORD = 0): Int64;
var
 hFile,FileLen,nBytesRead,i: DWORD;
 FBuf: array of Byte;
begin
 Result := 0;
 hFile := CreateFile(PChar(FileName),GENERIC_READ,FILE_SHARE_READ,
   nil,OPEN_EXISTING,0,0);
 if hFile <> INVALID_HANDLE_VALUE then
 begin
   FileLen := GetFileSize(hFile,nil);
   if FileLen <> 0 then
   begin
     if (nBytesToRead = 0) or (nBytesToRead > FileLen) then
       nBytesToRead := FileLen;
     SetLength(FBuf,nBytesToRead);
     ReadFile(hFile,FBuf[0],nBytesToRead,nBytesRead,nil);
     for i := Low(FBuf) to High(FBuf) do
     begin
       if i <> Low(FBuf) then
         Result := Result + (FBuf[i]+FBuf[i-1]) - FBuf[i]
       else
         Result := Result + (FBuf[i]+FBuf[i]);
     end;
     Finalize(FBuf);
   end;
   CloseHandle(hFile);
 end;
end;


 
Jeer ©   (2005-10-28 11:08) [1]

В основе CRC лежит теория.
Какая теория лежит в основе вашей - расскажите.


 
Изобретатель ©   (2005-10-28 11:16) [2]

Да все просто. При изменении/перестановке байтов в файле функция возвратит уже другое число, т.е контрольную сумму. Так можно отслеживать изменения, произошедшие в файле.


 
лауреат натрия   (2005-10-28 11:22) [3]

(FBuf[i]+FBuf[i-1]) - FBuf[i]

Это бред, или FBuf[i] ест - FBuf[i]?


 
Jeer ©   (2005-10-28 11:24) [4]

Изобретатель ©   (28.10.05 11:16) [2]

Тогда это конечно просто, но не доказуемо по надежности.


 
default ©   (2005-10-28 11:39) [5]

"for i := Low(FBuf) to High(FBuf) do
    begin
      if i <> Low(FBuf) then
        Result := Result + (FBuf[i]+FBuf[i-1]) - FBuf[i]
      else
        Result := Result + (FBuf[i]+FBuf[i]);
    end;
"
Low(FBuf)=0
то есть строка "else
        Result := Result + (FBuf[i]+FBuf[i]);"
отрабатывается на первой итерации значит её можно вынести за цикл начав цикл с 1
остаётся "Result + (FBuf[i]+FBuf[i]);"
а это классическая контрольная сумма только с множителем 2
2A+2B+2C+...=2(A+B+C+...)
непригодность A+B+C+...всем вроде бы ясна


 
default ©   (2005-10-28 11:48) [6]

попутал малость в [5]
остаётся "Result := Result + (FBuf[i]+FBuf[i-1]) - FBuf[i]"
а это классическая контрольная сумма
непригодность которой всем вроде бы ясна


 
isasa ©   (2005-10-28 11:58) [7]

эта... прошу указать вероятность совпадения контрольных сумм, для разных файлов ...



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1130955070
BobbyDigital
2005-11-02 21:11
2005.11.20
Время подсказки


2-1130491512
DEScc
2005-10-28 13:25
2005.11.20
description


2-1131051786
StasStas
2005-11-04 00:03
2005.11.20
Не сделать элементарную вещь ...


14-1130687101
DK2DK2DK2
2005-10-30 18:45
2005.11.20
ShareWare какими программами вы пользуетесь


14-1130442453
DiamondShark
2005-10-27 23:47
2005.11.20
Приближается последнее воскресенье октября.