字符串hash函数

字符串hash函数,解决冲突用开放定址法,每次对哈希值加1
在下列程序中,不是按常规方法用哈希表来记录关键字,
而是用整型数组Htable记录关键字在字符串ch中的位置。
在插入时不用把关键字复制到哈希表中,只是记录一个索引,从而提高了效率。
当查询时,只要把Htable的值映射到字符串ch中就可以了。
注意ch的下标要从1开始,因为Htable中的零值认为是空,处理起来比较方便。
#include < iostream >
#include
< string >
using   namespace  std;
const   int  MAXN  =   9973 // 哈希表长度
const   int  len  =   30 // 字符串的最大长度
int  Htable[MAX];
char  ch[MAX][len];  // 存储关键字的字符串
unsigned  long  Hash( char   *  key)
{
    unsigned 
long h = 0;
    
while(*key)
    
{
        h 
= (h << 4+ *key++;
        unsigned 
long g = h & 0xf0000000L;
        
if(g)
            h 
^= g >> 24;
        h 
&= ~g;
    }

    
return h % MAX;
}

int  search( char   *  key)
{
    unsigned 
long i = Hash(key);
    
while(Htable[i])
    
{
        
if(strcmp(ch[Htable[i]], key) == 0)
            
return i;
        i 
= (i + 1% MAX;
    }

    
return -1;
}

int  insert( char   *  key,  int  j)  // j为关键字在ch中的位置,即索引
{
    unsigned 
long i = Hash(key);
    
while(Htable[i])
        i 
= (i + 1% MAX;
    Htable[i] 
= j;
    
return i;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值