字符串哈希算法 我在Robert Sedwick的中阅读C++中的散列算法
字符串键的哈希函数的这种实现涉及键中每个字符的一次乘法和一次加法。如果我们将常数127替换为128,程序将使用Horner的方法,简单地计算与键的7位ASCII表示相对应的数字除以表大小时的余数。如果表大小是2的幂或2的倍数,素数基数127可以帮助我们避免异常字符串哈希算法 我在Robert Sedwick的中阅读C++中的散列算法,c,hash,C,Hash,字符串键的哈希函数的这种实现涉及键中每个字符的一次乘法和一次加法。如果我们将常数127替换为128,程序将使用Horner的方法,简单地计算与键的7位ASCII表示相对应的数字除以表大小时的余数。如果表大小是2的幂或2的倍数,素数基数127可以帮助我们避免异常 int hash(char *v, int M) { int h = 0, a = 127; for (; *v != 0; v++) h = (a*h + *v) % M; return
int hash(char *v, int M)
{ int h = 0, a = 127;
for (; *v != 0; v++)
h = (a*h + *v) % M;
return h;
}
理论上理想的通用散列函数是指大小为M的表中两个不同键之间发生冲突的概率恰好为1/M的函数。可以证明,使用不同随机值的序列而不是固定的任意值,对于程序14.1中的系数a,将模块散列转换为通用散列函数。但是,为密钥中的每个字符生成一个新的随机数的成本可能会很高。程序14.2演示了一个实际的折衷方案:我们通过生成一个简单的伪随机序列来改变系数
总之,要将哈希用于抽象符号表实现,第一步是扩展抽象类型接口,以包括将键映射为小于表大小M的非负整数的哈希操作。直接实施
内联int散列键v,int M
{返回int M*v-s/;}
对值s和t之间的浮点键执行作业;对于整数键,我们可以简单地返回v%M。如果M不是素数,则哈希函数可能返回
(int) (.616161 * (float) v) % M
或类似整数计算的结果,例如
(16161 * (unsigned) v) % M.
我的问题是,如果表大小是2的幂或2的倍数,作者如何表示素数基127有助于我们避免异常
authorm对于整数键意味着什么,我们可以简单地返回v%M
如果M不是素数,hash函数可能返回,这是什么意思
(int) (.616161 * (float) v) % M
内部6161*浮动v%M
或类似整数计算的结果,例如
(16161 * (unsigned) v) % M.
16161*未签名的v%M
作者是如何得出.6161和16161的
请求帮助以了解简单示例首先,基必须与字长共同素数,否则字符串的第一个字符不构成哈希值 e、 g.a=256;字符串AABA、AAABA、XYZAABA都将产生相同的散列,因为中间变量h是按模2^32计算的 当每个字符只使用7位时,它会稍微复杂一些,但原理是成立的
对于整数键,0@akishuihkoen:感谢您的澄清。在eg中为a=156选择的M值是多少,如上图所示/@AkiSuihoen:a=256上方的抱歉,以及我们如何得出结论,在eg中,所有的哈希值都是相同的。我们通过以下事实得出结论:Sumstr[i]*256^i将ascii字符串转换为大量的基256。当以256^4模计算此数字时,某些数字对最终值完全没有影响。