Delphi FNV哈希在64位操作系统中产生不同的结果

Delphi FNV哈希在64位操作系统中产生不同的结果,delphi,delphi-xe2,fnv,Delphi,Delphi Xe2,Fnv,我使用FNV在32位操作系统中散列文件。如果我在64位操作系统中使用相同代码,为什么相同代码的哈希结果不同 这是我的密码: function gethash(const dwOffset: PByteArray; const dwLen: DWORD; const offset_basis: DWORD): DWORD; var i: integer; begin Result := offset_basis; try {$R-}{$I-} for i := 0

我使用FNV在32位操作系统中散列文件。如果我在64位操作系统中使用相同代码,为什么相同代码的哈希结果不同

这是我的密码:

function gethash(const dwOffset: PByteArray; const dwLen: DWORD;
  const offset_basis: DWORD): DWORD;
var
  i: integer;
begin
  Result := offset_basis;
  try
    {$R-}{$I-}
    for i := 0 to dwLen - 1 do
      Result := (Result * 16777619) xor DWORD(dwOffset^[i]);
    {$R+}{$I+}
  except
    ;
  end;
end;

无论操作系统的位是多少,此代码都将产生相同的输出。此外,输出与进程的比特数无关。也就是说,如果编译32位和64位,输出将是相同的

因此,合乎逻辑的结论是,不同的输出是由提供不同的输入引起的

有人可能会问,为什么在代码中有一个吞咽所有异常处理程序。那一定是个坏主意。如果您提供了导致访问冲突的错误参数,您将永远无法发现。我敦促您删除该异常处理程序


为了证明我的观点,我提供了以下简单的测试程序:

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,
  System.SysUtils;

{$R-}{$I-}
function gethash(const dwOffset: PByteArray; const dwLen: DWORD;
  const offset_basis: DWORD): DWORD;
var
  i: integer;
begin
  Result := offset_basis;
  for i := 0 to dwLen - 1 do
    Result := (Result * 16777619) xor DWORD(dwOffset^[i]);
end;

procedure Main;
var
  i: Integer;
  buf: TBytes;
begin
  SetLength(buf, 666);
  for i := 0 to high(buf) do
    buf[i] := (i+13)*7 mod 256;
  Writeln(gethash(PByteArray(buf), Length(buf), 17));
end;

begin
  Main;
  Readln;
end.
这将在每个操作系统上产生相同的输出,并且在由32位或64位编译器编译时产生相同的输出。虽然这并不能证明每种可能的输入都是如此,但它为您提供了一个测试平台。你可以用你自己的输入替换我的输入,如果我是对的,你会发现对于固定的输入,输出总是一样的



对您的问题的一个合理解释是,您读取的数据超出了缓冲区的末尾,因此散列了定义错误的输入数据。也许使用不同的操作系统或编译器,定义错误的输入数据会有所不同。

如果只编译32位,如何使输出相同?我已经将所有DWORD都更改为Int64,结果仍然不同。我尝试编译64位,结果仍然不同。我相信你在补充答案中已经回答了这个问题。但是,我不可能更改代码,甚至不可能将所有代码编译为64位。我的32位程序坏了,可以用64位进行同样的输出,有没有什么破解方法?哈克?我建议你再看一遍答案。当在32/64位操作系统上运行时,当为32/64位进程编译时,该代码在给定相同输入的情况下生成相同的输出。将DWORD更改为Int64将完全改变代码的含义。不要那样做。这个问题讨论的是64位操作系统,但您也讨论了为64位进程编译。是哪一个?32/64操作系统,或32/64位进程?我删除了以前的注释,并将答案还原为原始形式。那些评论和我的答案更新都是胡说八道。我以前编译我的程序时,目标平台是32位Windows 7和32位Windows。该代码用于生成许多文件的哈希。问题是我并没有那个些文件了,所以我不想改变我的散列函数。我在Windows7 64位中尝试我的程序,它会产生不同的结果。我不想将64位Windows的程序编译为目标平台。有黑客吗?