对字符串进行哈希的算法,hash_func
来源:互联网 发布:anywhere软件源地址 编辑:程序博客网 时间:2024/05/15 23:50
最近做了一个Dns日志解析的项目,需要对字符串进行大量查找,对效率要求比较高,所以在网上找了很多关于哈希的资料,
在网上找了一个算法如下:
inline static unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register unsigned int h = 0;
register unsigned short *p = (unsigned short *)str;
register unsigned short *s = (unsigned short *)str;
while(p - s < len)
{
register unsigned short a = *(p++) * (p-s);
sum += sum ^ a;
h += a;
printf("a = %u\n",a);
}
return ((sum << 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;
}
上面这个算法看上去好像是没什么问题,其实这个算法是有问题的,我测试发现,对同一个字符串比如 "OtherCityimg02.taobaocdn.com" 每次哈希的结果不一定一样,
主要是 register unsigned short *p = (unsigned short *)str;
register unsigned short *s = (unsigned short *)str;
导致的,这样p++一次其实是跳了两个字符,所以我做了如下改进:
inline static unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register unsigned int h = 0;
register unsigned char *p = (unsigned char *)str;
register unsigned char *s = (unsigned char *)str;
while(p - s < len)
{
register unsigned char c = (*(p++));
register unsigned int d = (p-s);
register unsigned int a = ( c * d);
sum += sum ^ a;
h += a;
}
return ((sum << 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;
}
现在每次对同一个字符串哈希结果都是一样的了。好,收工!
- 对字符串进行哈希的算法,hash_func
- 《ASCE1885的信息安全》の使用Crypto++的MD5算法对字符串进行哈希
- 使用JDK提供的MD5算法对字符串进行加密
- 对字符串进行的操作
- 用冒泡排序的算法对输入的字符串进行排序
- 关于输入一个字符串,对其进行全排列的两种算法
- 应用哈希对字符串问题进行高效处理
- 对一些字符串进行操作的类
- Java对字符串进行的操作
- 请使用一种算法,对字符串进行升序排列
- 对字符串进行拆分
- 对字符串进行排序
- 对字符串进行编码
- 对A*算法的路径进行优化
- 对大对象进行排序的算法
- 对字符串中的字母进行排序,变成有序的字符串
- 分享一个新的对字符串的哈希算法之FastHash
- 使用快速排序算法对字符串数组进行排序(复习指向指针的指针以及指针数组的使用)
- svn eclipse
- no permissions fastboot 解决
- CentOS开机启动服务
- Nginx+Memcached为啥具有高性能
- 用gdb调试C程序的简单介绍
- 对字符串进行哈希的算法,hash_func
- Direct3D 10教程4:3D空间
- 类的实例化过程小结
- 现货cpc黄金白银日分析报告4.25
- Unity3D中定时器的使用
- 一个简单的UDP广播例子(含C/S)
- libpcap调试过程
- android ActionBar的使用
- 【jQuery学习笔记-----绝对偏移位置】