为什么 BobJenkinsHash 函数在这种情况下返回范围错误?

问题描述 投票:0回答:1

在 FPC Lazarus 下,我使用以下函数来计算字符串的哈希值,这用于将对象保存在字典中:

function MyClass.HashCode(): UInt32;
var
  keyStr: string;
begin
  keyStr := KeyToString();
  Result := BobJenkinsHash(keyStr[1], Length(keyStr) * SizeOf(Char), 0);
end;

这个函数有时会抛出错误:

项目< Name >引发了异常类“RunError(201)”,并带有消息:
范围检查错误

在文件 < source > 行 < Line >:
结果 := BobJenkinsHash(keyStr[1], Length(keyStr) * SizeOf(Char), 0);

经过一些使用后,这种情况会连贯地发生。我不确定是否有一些特定的字符串或使用次数。例如:“Button_logo”似乎会引发此错误。

我找不到(不幸的是)相关文档:我发现没有 FPC 文档,而 Delphi 文档(大多数时候)是不相关的。

delphi lazarus
1个回答
0
投票

我不知道这是否适用于 FreePascal,但在 Delphi 中,

BobJenkinsHash()
函数(已弃用,BTW)返回一个 signed
Integer
,您将其分配给 unsigned
UInt32
。如果它返回负值(请参阅https://www.appsloveworld.com/coding/delphi/18/can-result-of-bobjenkinshash-function-be-male),则会引发范围检查错误。因此,只需关闭作业周围的范围检查即可。

© www.soinside.com 2019 - 2024. All rights reserved.