我理解哈希表的数学基础。我有一个哈希函数(我在某处找到):
/* 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;
}
size_t
?store()
函数放置一个
哈希表中的字符串?for
循环的while
循环
终止于'\0'
字符?仅供参考,我正在研究第二次面试,这就是我要问的原因。
答案 0 :(得分:2)
返回size_t
,因为这是本机整数(也是最快的)。为什么选择别的什么?
“桌子”?哪张桌子?如果你的意思是哈希表,那么你可以使用返回值来选择一个随机桶来放置对象。(提示:想想“余数”。)
是不是已经适应了阵列?
如果它是以空字符结尾的字符串,为什么不呢?
答案 1 :(得分:1)
它不一定是size_t
,但它应该是无符号整数类型,因此mod是明确定义的。
通常的方法是使用哈希函数将“密钥”数据转换为数组索引。因此,您可以通过数组的大小来修改从0到SIZE-1的整数,您可以将其用作索引。您还需要一个“冲突解决策略”,因为除非哈希产生完美的结果,否则一些不同的键将散列到相同的值。
似乎已经适应了。
如果字符串以NUL结尾,则可以搜索null。但是写入的函数作为参数传递长度。最简单的方法是单独使用工作函数,并使用strlen()的结果调用它。
聚苯乙烯。 const string &s
表示C ++,不 C.这在编译时可能很重要。
答案 2 :(得分:1)
string
拥有它自己的长度,你不需要传入它。那是C ++,而不是C- C中没有引用。不需要strlen
或类似的东西,或者NULL
终结者或者其他人。这意味着用一个寻找\0
的while循环替换它将是Bad™,因为不能保证std::string
甚至有一个,更不用说它是它的终止符。