问题描述
|
我了解哈希表的数学基础。我在下面有一个哈希函数(在某个地方找到):
/* 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”?
一个人怎么用这个写一个
store()
功能
哈希表中的字符串?
如何适应数组
字符?
关于#3,是否适合替换
for
循环和while
循环
以“ 5”字符结尾?
仅供参考,我正在学习第二份工作面试,这就是为什么我要问。
解决方法
它返回
size_t
,因为那是本地整数(也是最快的)。为什么还要选择其他东西?
\“桌子\”?哪张桌子如果您指的是哈希表,则可以使用返回值选择一个随机存储桶以将对象放入其中。(提示:认为\“ remainder \”。)
它是否已经适合数组?
如果它是一个以空值结尾的字符串,为什么不呢?
,
它不一定是ѭ1probably,但是它可能应该是无符号整数类型,因此mod是定义良好的。
通常的方法是使用哈希函数将“键”数据转换为数组索引。因此,您可以根据数组的大小进行修改,以获得0到SIZE-1之间的整数,您可以将其用作索引。您还需要一种“冲突解决策略”,因为除非哈希产生完美的结果,否则一些不同的密钥对将哈希为相同的值。
它似乎已经适应了。
如果字符串以NUL结尾,则可以搜索null。但是,所编写的函数将传递长度作为参数。最简单的方法是不使用工作函数,并使用strlen()的结果进行调用。
附言const string &s
表示C ++,而不是C。这在编译时可能很重要。
, string
具有它自己的长度,您不需要传递它。这是C ++,而不是C-在C中没有引用。不需要strlen
或类似的东西,或NULL
终止符或其他任何形式。这意味着用一个寻找while12ѭ的while循环替换它会是Bad™,因为不能保证std::string
甚至有一个,更不用说它是终止符了。