关于字符串哈希函数

huayd 2006-10-24 11:26:17
对下面的字符串哈希函数,怎么看都不明白,书上也没有解释,麻烦高手给个解释,最好有例子.先谢过.

代码如下:
#include <cstdio>
#include <cstring>

const int PRIME = 25013;

int hashpjw(char *p)
{
unsigned int h=0, g;
for(; *p; ++p)
{
h = (h<<4) + *p;
if(g = h & 0xf0000000)
{
h = h ^ (g >> 24);
h = h ^ g;
}
}
return h % PRIME;
}
...全文
337 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a_b_c_abc11 2006-10-25
  • 打赏
  • 举报
回复
我只知道,不同的字符串能返回不同的整数,就是一个好的哈希函数。
他之所以又是移位,又是异或,最后还要对一个素数取模,为的就是这个目的,至于它依据的数理,我不知道。相同目的的哈希函数还有其他方法实现的。
Kusk 2006-10-24
  • 打赏
  • 举报
回复
另外,哈希函数的构造通常用到一些复杂的数论知识,最终目的是尽可能地能把有意义的输入打散,
让它的哈希值尽量满足平均分布。所以函数的形式与算法通常都是希奇古怪的。如果不是这个领域的
研究者,一般会用就足够了,不必就为什么这样定义而深究过多。
Kusk 2006-10-24
  • 打赏
  • 举报
回复
#include <cstdio>
#include <cstring>

const int PRIME = 25013;

int hashpjw(char *p)
{
unsigned int h=0, g; /* h参数初始化为0,它用于调整hash值 */
for(; *p; ++p) /* 对p所指的字符串进行逐字符遍历 */
{
h = (h<<4) + *p; /* h的值左移四位(相当于乘以16)再加上当前字符的ASCII码
if(g = h & 0xf0000000) /* 将h值的高字节的前4位赋给g的相应位,g的其它位置0 */
{ /* 并判断g(实际上是h的高字节的前4位)是否为0 */
/* 若是,则将h的31~28位及7~4位依次与g作异或,结果传回h */
h = h ^ (g >> 24);
h = h ^ g;
}
} /* 继续下一字符 */
return h % PRIME; /* 返回h除PRIME的余数,PRIME实际上是哈希值的范围,通常认为取质数效果较好 */
}

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧