Форум: "Потрепаться";
Текущий архив: 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.041 c