字符串 – BobJenkinsHash函数的结果可能是否定的?

字符串 – BobJenkinsHash函数的结果可能是否定的?,第1张

概述环境:Win7 64bit,Delphi 2010,Win32项目. 我尝试在Generics.Defaults的BobJenkinsHash()函数的帮助下获取字符串集的整数哈希值. 它有效,但有些观点对我来说并不清楚. >功能结果可能是否定的? 我看到了 on source site使用uint32_t作为hashword()函数的结果类型: uint32_t hashword(const 环境:Win7 64bit,Delphi 2010,Win32项目.

我尝试在Generics.Defaults的BobJenkinsHash()函数的帮助下获取字符串集的整数哈希值.

它有效,但有些观点对我来说并不清楚.

>功能结果可能是否定的?

我看到了
on source site使用uint32_t作为hashword()函数的结果类型:

uint32_t hashword(const uint32_t *k,/* the key,an array of uint32_t values  */size_t          length,/* the length of the key,in uint32_ts    */uint32_t        initval)         /* the prevIoUs hash,or an arbitrary value */{

它是unsigned int吗?

>第二个问题是我对具有相同值的不同字符串有不同的结果:

'DEFPROD001' => 759009858'DEFPROD001' => 1185633302

这是正常的行为吗?

我的全部函数来计算哈希值(如果第一个参数为空则返回第二个):

function TAmWriterJD.ComposeID(const defaultID: string; const GUID: String): String;var  bjh: Integer;begin  if defaultID = '' then  begin    Result := GUID  end  else  begin    bjh := BobJenkinsHash(defaultID,Length(defaultID) * SizeOf(defaultID),0);    Result := IntToStr(bjh);  end;end;
解决方法@H_403_40@ Delphi实现声明如下:

function BobJenkinsHash(const Data; Len,InitData: Integer): Integer;

它返回一个带符号的32位整数.所以是的,这个实现可以返回负值.

您引用的C实现返回无符号的32位整数.这样就无法返回负值.

假设两个实现都是正确的,那么在给定相同输入的情况下,它们将返回相同的32位输出.只是当解释为有符号或无符号值时,这些位具有不同的含义.

至于你的第二个问题,将相同的字符串传递给散列函数将产生相同的散列.你必须在测试用例中犯了一个错误.

BobJenkinsHash(defaultID,0);

这里defaultID是一个字符串变量,它实现为一个指针.因此,您正在对地址进行哈希处理.由于你的长度参数不正确,甚至没有正确地做到这一点.相反,你需要写:

BobJenkinsHash(Pointer(defaultID)^,Length(defaultID) * SizeOf(Char),0);

该计划表明:

{$APPTYPE CONSolE}uses  System.Generics.Defaults;var  s,t: string;begin  s := 'DEFPROD001';  t := 'DEFPROD001';  Writeln(BobJenkinsHash(s,Length(s) * SizeOf(s),0));  Writeln(BobJenkinsHash(t,Length(t) * SizeOf(t),0));  Writeln(BobJenkinsHash(Pointer(s)^,Length(s) * SizeOf(Char),0));  Writeln(BobJenkinsHash(Pointer(t)^,Length(t) * SizeOf(Char),0));  Readln;end.

输出:

2129045826-331457644-161666357-161666357
总结

以上是内存溢出为你收集整理的字符串 – BobJenkinsHash函数的结果可能是否定的?全部内容,希望文章能够帮你解决字符串 – BobJenkinsHash函数的结果可能是否定的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1251218.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存