Главная страница
    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.037 c
2-1130453251
Dub
2005-10-28 02:47
2005.11.20
что за глюк и с чем его кушать?


14-1130613413
Prohodil Mimo
2005-10-29 23:16
2005.11.20
Снова о Delphi 2005


14-1130827511
Ega23
2005-11-01 09:45
2005.11.20
С днем рождения! 1 ноября


14-1130778374
-=XxX=-
2005-10-31 20:06
2005.11.20
PHP4Delphi


8-1120032599
PVR
2005-06-29 12:09
2005.11.20
mp3 поток





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