Главная страница
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.065 c
2-1130959225
Sysanin
2005-11-02 22:20
2005.11.20
TServerSocket и TClietSocket


3-1128617563
Michael5
2005-10-06 20:52
2005.11.20
Скролл "колесиком" в DBGrid работает только в видимой части грида


2-1131018738
Woolen
2005-11-03 14:52
2005.11.20
Непонятное поведение строк


4-1127131859
NightLord
2005-09-19 16:10
2005.11.20
Графика и WinApi


2-1131264952
злобная танька
2005-11-06 11:15
2005.11.20
TMethod