在 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 文档(大多数时候)是不相关的。
我不知道这是否适用于 FreePascal,但在 Delphi 中,
BobJenkinsHash()
函数(已弃用,BTW)返回一个 signed Integer
,您将其分配给 unsigned UInt32
。如果它返回负值(请参阅https://www.appsloveworld.com/coding/delphi/18/can-result-of-bobjenkinshash-function-be-male),则会引发范围检查错误。因此,只需关闭作业周围的范围检查即可。