繁体   English   中英

为什么哈希函数返回size_t,它是如何使用的?

[英]Why does a hash function return a size_t, and how is it used?

我理解哈希表的数学基础。 我有一个哈希函数(我发现在某处)下面:

/* Fowler / Noll / Vo (FNV) Hash */
static const size_t InitialFNV = 2166136261U;
static const size_t FNVMultiple = 16777619;
size_t myhash(const string &s, int length)
{
    size_t hash = InitialFNV;
    for(size_t i = 0; i < length; i++)
    {
        //XOR the lower 8 bits
        hash = hash ^ (s[i]);

        //Multiply by the multiple
        hash = hash * FNVMultiple;
    }
    return hash;
}
  1. 为什么这会返回size_t
  2. 如何使用它来编写一个store()字符串放在哈希表中的store()函数?
  3. 如何适应一系列角色?
  4. 关于#3,用一个终止于'\\0'字符的while循环替换for循环是否合适?

仅供参考,我正在研究第二次面试,这就是我要问的原因。

  1. 它返回size_t因为这是本机整数(也是最快的)。 为什么选择别的?

  2. “桌子”? 哪张桌子? 如果你的意思是哈希表,那么你可以使用返回值来选择一个随机桶来放置对象。(提示:想想“余数”。)

  3. 是不是已经适应了阵列?

  4. 如果它是一个以null结尾的字符串,为什么不呢?

  1. 它不一定是size_t ,但它应该是无符号整数类型,因此mod是明确定义的。

  2. 通常的方法是使用散列函数将“密钥”数据转换为数组索引。 因此,您可以通过数组的大小来修改从0到SIZE-1的整数,您可以将其用作索引。 您还需要一个“冲突解决策略”,因为除非哈希产生完美的结果,否则一些不同的键将散列到相同的值。

  3. 它似乎已经如此适应。

  4. 如果字符串以NUL结尾,则可以搜索null。 但是写入的函数作为参数传递长度。 最简单的方法是单独保留工作函数,并使用strlen()的结果调用它。

PS。 const string &s表示C ++, 而不是 C.这在编译时可能很重要。

string保存它自己的长度,你不需要传入它。那是C ++,而不是C- C中没有引用。不需要strlen或类似的东西,或NULL终结符,或者它们。 这意味着用一个寻找\\0的while循环替换它将是Bad™,因为不能保证std::string甚至有一个,更不用说它是它的终止符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM