字符串 – BobJenkinsHash函数的结果可能是否定的?
环境:Win7 64bit,Delphi 2010,Win32项目.
我尝试在Generics.Defaults的BobJenkinsHash()函数的帮助下获取字符串集的整数哈希值. 它有效,但有些观点对我来说并不清楚. >功能结果可能是否定的? 我看到了 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; 解决方法
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |