Главная страница
    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.46 MB
Время: 0.034 c
1-1130676546
Draught
2005-10-30 15:49
2005.11.20
Замена Memo на что либо более подходящее


14-1130749100
Opilki_Inside
2005-10-31 11:58
2005.11.20
Интеграция Help-файлов с приложением


2-1130915853
nbab
2005-11-02 10:17
2005.11.20
Как кнопку сделать плоской, (как в панели быстрого запуска)?


3-1128597127
a80h19
2005-10-06 15:12
2005.11.20
Создание БД через ADO


2-1131185953
Зм1й
2005-11-05 13:19
2005.11.20
Адекватная реакция :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский