gpt4 book ai didi

string - BobJenkinsHash 函数的结果可以为负数吗?

转载 作者:行者123 更新时间:2023-12-03 15:23:14 27 4
gpt4 key购买 nike

环境:Win7 64位、Delphi 2010、Win32项目。

我尝试借助 Generics.Defaults 中的 BobJenkinsHash() 函数获取字符串集的整数哈希值。

它有效,但有些点我不清楚。

  1. 函数的结果可以为负数吗?

据我所知 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 */
{

它是无符号整数吗?

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

    '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, Length(defaultID) * SizeOf(defaultID), 0);

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

    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

    关于string - BobJenkinsHash 函数的结果可以为负数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39244464/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com