数组元素的校验和

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()功能?我试过xorCRC32,但他们是不是真的适合这个任务,因为它们返回重复值.我想为每一行生成一个唯一的校验和.

编辑 哦,校验和应该以允许比较行的方式计算.我想拿两个不同行的校验和,并判断其中一个是否大于另一个,小于另一个,或相等.有机会实现这样的目标吗?

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)

谢谢.

Arn*_*hez 6

您的数据对我来说听起来不连贯.你定义了一个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)