【发布时间】:2010-09-28 07:17:45
【问题描述】:
我需要在大文件上使用 1021 美元的多项式计算 Crc16 校验和,下面是我当前的实现,但它在大文件上相当慢(例如,一个 90 MB 的文件大约需要 9 秒)。
所以我的问题是如何改进我当前的实现(使其更快),我用谷歌搜索并查看了一些实现表查找的示例,但我的问题是我不明白如何修改它们以包含多项式(可能我的数学不及格)。
{ based on http://miscel.dk/MiscEl/CRCcalculations.html }
function Crc16(const Buffer: PByte; const BufSize: Int64;
const Polynom: WORD=$1021; const Seed: WORD=0): Word;
var
i,j: Integer;
begin
Result := Seed;
for i:=0 to BufSize-1 do
begin
Result := Result xor (Buffer[i] shl 8);
for j:=0 to 7 do begin
if (Result and $8000) <> 0 then
Result := (Result shl 1) xor Polynom
else Result := Result shl 1;
end;
end;
Result := Result and $FFFF;
end;
【问题讨论】:
-
如何将文件加载到内存中?瓶颈可能是文件 IO,而不是您的 CRC 函数。即,什么是慢的:在文件上计算 CRC 的过程,或者在内存缓冲区上计算来自很久以前加载并且绝对没有被测量的源的 CRC 的过程?
-
它被加载到一个 TMemoryStream 中(所以它是在内存中的缓冲区)所以我认为它必须是计算。
标签: delphi delphi-2010 crc