很好的HASH表实现
时间:2010-07-12
来源:互联网
也是从Snort2.8.5摘出来的。
1:删除无用的头文件
2:修改了几个包装函数(关于内存分配和字符串的)
研究了将近3个小时,代码结构非常好,Hash函数是依赖一个大素数表,效果怎么样不知道,
俗话说的好:谁用谁知道
作者: 印随 发布时间: 2010-07-12
- SFXHASH * sfxhash_new( int nrows, int keysize, int datasize, int maxmem,
- int anr_flag,
- int (*anrfree)(void * key, void * data),
- int (*usrfree)(void * key, void * data),
- int recycle_flag )
nrows:hash表中“桶”的个数
keysize:key的长度,就是说作为hash函数的参数的长度(字节)
datasize:0:表示用户不需要关心data的内存管理,!0表示用户自己管理data内存的申请和释放
anr_flag:是否自动回收节点。当内存达到上限时,把最老旧点重新利用
anrfree():释放函数,返回零,可以重新利用。返回非零,不重新利用最旧节点
recycle_flag:节点不释放,存在在free_list中,加入新节点的时候,直接从free_list中取,而不是malloc
作者: 印随 发布时间: 2010-07-12
作者: starwing83 发布时间: 2010-07-12
作者: starwing83 发布时间: 2010-07-12
是说 hash表实现慢? 还是 有“拉链法”的hash函数? 没听过“拉链法” 这种说法。
弱弱问下,VimE的hash,又大概是怎么实现的?
作者: peidright 发布时间: 2010-07-12
回复 starwing83
恩,是需要实际测试一下,不然在项目中使用心里没底
作者: 印随 发布时间: 2010-07-12
拉链法优点在于编程简单。不需多次计算hash值,缺点在于浪费内存,减少填充率。
如果计算新的hash函数能和dereference一样快,那么拉链法就没有任何优势了。
所以理论上开放定址法比拉链法要高效。
另外,质数递增对减少碰撞的确有优势,但是好的hash函数应该也可以避免这一点。所以,还是很多函数使用了2次幂递增。
sfxhash:质数递增+拉链法
vimhash:2幂次递增+开放定址法
hash函数没比较,一般情况下times33效率比较高,Vim是times33的变种,不知道sfxhash是什么hash函数。
作者: starwing83 发布时间: 2010-07-12
- void sfhashfcn_static( SFHASHFCN * p )
- {
- p->seed = 3193;
- p->scale = 719;
- p->hardener = 133824503;
- }
-
- unsigned sfhashfcn_hash( SFHASHFCN * p, unsigned char *d, int n )
- {
- unsigned hash = p->seed;
- while( n )
- {
- hash *= p->scale;
- hash += *d++;
- n--;
- }
- return hash ^ p->hardener;
- }
作者: 印随 发布时间: 2010-07-12
我还是最喜欢简单的冲突解决方法。。,否则感觉还不如用其他数据结构,或者某种混合的数据结构。
有个疑问,就是, vimhash "2幂次递增+开放定址法" 意思是没有任何情况,需要用连表法解决冲突?
如果hash表数组充满了呢? 或者说,hash表,不适合用于存储,内容大于数组的情况?, 我个人觉得,vimhash 只适合要存储的内容,小于数组长度2/3,3/4 的情况,某种角度,也不存在是否浪费空间,不浪费空间了。。
作者: peidright 发布时间: 2010-07-12
作者: zhaohongjian000 发布时间: 2010-07-12
作者: owood 发布时间: 2010-07-13
作者: liexusong 发布时间: 2010-07-13
节点数:46028
hash桶:46028
碰撞深度:7
hash使用率:50.65%
测试了10次,误差小于1.
为什么测试十次?
因为hash函数是动态生成的,所以每次的hash函数都不一样
作者: 印随 发布时间: 2010-07-13
测试代码也发一下,学习一下。
作者: peidright 发布时间: 2010-07-13
其实就是从数据文件中读取字符串然后插入hash表中,数据文件在1楼下载
- /* Add Nodes to the Hash Table */
- fp = fopen("word_line.txt", "r");
- if(!fp)
- {
- printf("open file failed!\n");
- exit(0);
- }
- for(;;)
- {
- ret = fgets(buf, 1024, fp);
- if(ret == NULL)
- break;
- sfxhash_add( t, buf/* key */, buf /* data */ );
- }
- fclose(fp);
作者: 印随 发布时间: 2010-07-13
- double sfxhash_used_rate( SFXHASH * t )
- {
- unsigned i;
- double used = 0;
-
- SFXHASH_NODE * hnode;
-
- for( i=0; i<t->nrows; i++ )
- {
-
- hnode = t->table[i];
- if(hnode != NULL)
- used++;
- }
-
- return used/(t->nrows);
- }
作者: 印随 发布时间: 2010-07-13
- // DJB Hash Function
-
- //It is one of the most efficient hash functions ever published.
-
- unsigned int DJBHash(char *str)
- {
- unsigned int hash = 5381;
- while (*str)
- {
- hash += (hash << 5) + (*str++);
- }
- return (hash & 0x7FFFFFFF);
- }
作者: 印随 发布时间: 2010-07-13
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28