Pat*_*man 3 delphi checksum multidimensional-array
我有一个多维数组,Bytes
定义如下:
type
TRow = array[0..6] of Byte;
var
All: array[0..19112079] of TRow;
Run Code Online (Sandbox Code Playgroud)
现在,我想为数组所包含的每一行生成唯一的校验和并保存到文件中,如下所示:
var
I: Integer;
begin
for I := 0 to 19112079 do
begin
Checksum := GenerateChecksum(All[I]);
Writeln(F, Checksum);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我应该怎么做这个GenerateChecksum()
功能?我试过xor
和CRC32
,但他们是不是真的适合这个任务,因为它们返回重复值.我想为每一行生成一个唯一的校验和.
编辑 哦,校验和应该以允许比较行的方式计算.我想拿两个不同行的校验和,并判断其中一个是否大于另一个,小于另一个,或相等.有机会实现这样的目标吗?
EDIT2 两个相邻行中的示例数据:
Row x - 1: 120, 444, 323, 984, 1024, 76, 130
Row x: 120, 444, 323, 984, 1024, 76, 222
Row x + 1: 120, 444, 323, 984, 1024, 76, 121
. . .
Row x + n: 120, 444, 323, 984, 6333, 33, 935
Run Code Online (Sandbox Code Playgroud)
谢谢.
您的数据对我来说听起来不连贯.你定义了一个array[0..6] of byte
,但在你的数据示例中,你有超出字节范围的值,即0..255,如444,323,1024 ...某处有错误.
由于每行只包含7个字节的数据,因此最简单的方法是将其包装成一个Int64
值.这不是一个crc,而只是一个类型转换.所以根据定义,你不会在这里发生任何碰撞 - 这是一个完美的哈希.
它是某种"穷人的哈希",但它会很容易.
function HashOf(const Row: TRow): Int64; inline;
begin
result := PInt64(@Row)^ and $00ffffffffffffff;
end;
Run Code Online (Sandbox Code Playgroud)
我已经定义了函数,inline
因为它会更快.
对于TRow
数组中的最后一个,您将有一个字节重叠的内存访问,但它将按预期工作.为了避免这种情况,一个更慢但更安全的功能:
function HashOf(const Row: TRow): Int64;
begin
result := 0;
move(Row,result,sizeof(Row));
end;
Run Code Online (Sandbox Code Playgroud)