Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
Изобретатель ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.044 c
2-1130596420
ruslan1
2005-10-29 18:33
2005.11.20
LPT порт


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


2-1131164479
zaN0za
2005-11-05 07:21
2005.11.20
Вопрос по RasAPI


1-1130482777
Alex--
2005-10-28 10:59
2005.11.20
Проблема отбражения не стандартных цветов (XPManifest)


10-1107741402
Сергей Александров
2005-02-07 04:56
2005.11.20
COM Server&amp;Client (почти по Тенцеру)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский