我尝试在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函数的结果可能是否定的?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)