为什么哈希函数返回size_t,以及如何使用它

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

本文关键字:何使用 函数 哈希 返回 size 为什么      更新时间:2023-10-16

我了解哈希表的数学基础。 我在下面有一个哈希函数(我在某处找到(:

/* 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()函数,用于放置哈希表中的字符串?
  3. 如何适应阵列角色数?
  4. 关于#3,是否适合替换具有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终结者,或者任何类似的东西。这意味着用寻找的while循环替换它将是不好™的,因为不能保证std::string甚至有一个,更不用说让它作为它的终结者了。