免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4694 | 回复: 11
打印 上一主题 下一主题

有关字符串的hash表 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-15 16:34 |只看该作者 |倒序浏览
有几万个基于某字符集的字符串,长度为30。为了便于另外几万个字符串和这个集合的比较,想把这个字符集合建立一个hash表,但是建立字符串集合的hash表,用什么来做hash函数呢? 比如拿前10个字符的ASCII码等来做,各位有什么好的办法来建立hash表以使得这个比较操作更快,谢谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-06-15 16:58 |只看该作者
请参考gperf。

论坛徽章:
0
3 [报告]
发表于 2007-06-15 17:06 |只看该作者
贴一个我用的,呵好像php中也是用这个,我是参考自cdb

static unsigned int _xdb_hasher(const char *s, int len)
{
        unsigned int h = 0xf422f;
        while (len--)
        {
                h += (h<<5);
                h ^= (unsigned char) s[len];
                h &= 0x7fffffff;
        }
        return h;
}

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-06-15 17:36 |只看该作者
原帖由 gridbird 于 2007-6-15 16:34 发表
有几万个基于某字符集的字符串,长度为30。为了便于另外几万个字符串和这个集合的比较,想把这个字符集合建立一个hash表,但是建立字符串集合的hash表,用什么来做hash函数呢? 比如拿前10个字符的ASCII码等来做, ...

The Practice of Programming 中给出了一个,据称是最好的(对 ASCII 字符串来说)。

[ 本帖最后由 MMMIX 于 2007-6-15 17:38 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-06-15 19:58 |只看该作者
原帖由 gridbird 于 2007-6-15 16:34 发表
有几万个基于某字符集的字符串,长度为30。为了便于另外几万个字符串和这个集合的比较,想把这个字符集合建立一个hash表,但是建立字符串集合的hash表,用什么来做hash函数呢? 比如拿前10个字符的ASCII码等来做, ...

google一下吧  很多进行hash操作的实现啊
比如 关键词:字符串哈希

论坛徽章:
0
6 [报告]
发表于 2007-06-15 22:36 |只看该作者
贴一个现在项目用到的hash函数,可以把传入的一个字符串hash出一个整数,保证了大致平均分配,具体的数学原理我也不太清楚。


  1. #define API_Mix(a,b,c) \
  2. { \
  3.   a -= b; a -= c; a ^= (c >> 13); \
  4.   b -= c; b -= a; b ^= (a << 8); \
  5.   c -= a; c -= b; c ^= (b >> 13); \
  6.   a -= b; a -= c; a ^= (c >> 12);  \
  7.   b -= c; b -= a; b ^= (a << 16); \
  8.   c -= a; c -= b; c ^= (b >> 5); \
  9.   a -= b; a -= c; a ^= (c >> 3);  \
  10.   b -= c; b -= a; b ^= (a << 10); \
  11.   c -= a; c -= b; c ^= (b >> 15); \
  12. }


  13. unsigned int bobhash(void *val, unsigned int length)
  14. {
  15.         char *k = (char *)val;
  16.         unsigned long a,b,c,len;

  17.         /* Set up the internal state */
  18.        
  19.         len = length;
  20.         a = b = c = 0x9e3779b9;         /* the golden ratio; an arbitrary value */

  21.         /* Handle most of the key */
  22.        
  23.         while ( len >= 12 )
  24.         {
  25.                 a += (k[0] +((unsigned long)k[1] << 8) +((unsigned long)k[2] << 16) +((unsigned long)k[3] << 24));
  26.                 b += (k[4] +((unsigned long)k[5] << 8) +((unsigned long)k[6] << 16) +((unsigned long)k[7] << 24));
  27.                 c += (k[8] +((unsigned long)k[9] << 8) +((unsigned long)k[10]<< 16)+((unsigned long)k[11] << 24));
  28.                 API_Mix(a,b,c);
  29.                 k += 12; len -= 12;
  30.         }

  31.         /* Handle the last 11 bytes */
  32.        
  33.         c += length;
  34.         switch ( len )                                /* all the case statements fall through */
  35.         {
  36.                 case 11: c+=((unsigned long)k[10] << 24);
  37.                 case 10: c+=((unsigned long)k[9]  << 16);
  38.                 case 9 : c+=((unsigned long)k[8]  << 8);
  39.                         /* the first byte of c is reserved for the length */
  40.                 case 8 : b+=((unsigned long)k[7] << 24);
  41.                 case 7 : b+=((unsigned long)k[6] << 16);
  42.                 case 6 : b+=((unsigned long)k[5] << 8);
  43.                 case 5 : b+=k[4];
  44.                 case 4 : a+=((unsigned long)k[3] << 24);
  45.                 case 3 : a+=((unsigned long)k[2] << 16);
  46.                 case 2 : a+=((unsigned long)k[1] << 8);
  47.                 case 1 : a+=k[0];
  48.         }
  49.        
  50.         API_Mix(a,b,c);
  51.         return c;
  52. }
复制代码


传入要进行hash的字符串和hash表的大小即可。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2007-06-15 23:24 |只看该作者
原帖由 converse 于 2007-6-15 22:36 发表
贴一个现在项目用到的hash函数,可以把传入的一个字符串hash出一个整数,保证了大致平均分配,具体的数学原理我也不太清楚。

[code]
#define API_Mix(a,b,c) \
{ \
  a -= b; a -= c; a ^= (c >> 13) ...

这种代码最好在注释中说明一下从什么资料中可以得到算法的具体描述。

论坛徽章:
0
8 [报告]
发表于 2007-06-15 23:25 |只看该作者
原帖由 MMMIX 于 2007-6-15 23:24 发表

这种代码最好在注释中说明一下从什么资料中可以得到算法的具体描述。


出处不详

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2007-06-15 23:56 |只看该作者
原帖由 converse 于 2007-6-15 23:25 发表


出处不详

呃……我指定是写这段代码的人应该在注释中说明一下。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2007-06-16 00:10 |只看该作者
原帖由 converse 于 2007-6-15 22:36 发表
贴一个现在项目用到的hash函数,可以把传入的一个字符串hash出一个整数,保证了大致平均分配,具体的数学原理我也不太清楚。

[code]
#define API_Mix(a,b,c) \
{ \
  a -= b; a -= c; a ^= (c >> 13) ...

你的算法太复杂了。
好得hash算法哪有这么复杂的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP