一个开源的哈希表源码实现

 

struct  entry
{
    
void *k, *v;
    unsigned 
int h;
    
struct entry *next;
}
;

struct  hashtable  {
    unsigned 
int tablelength;
    
struct entry **table;
    unsigned 
int entrycount;
    unsigned 
int loadlimit;
    unsigned 
int primeindex;
    unsigned 
int (*hashfn) (void *k);
    
int (*eqfn) (void *k1, void *k2);
}
;

static   const  unsigned  int  primes[]  =   {
    
5397193389769154330796151,
    
12289245934915798317,
    
1966133932417864331572869,
    
314573962914691258291725165843,
    
50331653100663319201326611402653189,
    
8053064571610612741
}
;

const  unsigned  int  prime_table_length  =   sizeof (primes) / sizeof (primes[ 0 ]);
const   float  max_load_factor                  =   0.65 ;

struct  hashtable  * create_hashtable(unsigned  int  minsize,
                                                             unsigned 
int  ( * hashf) (  struct  hashtable  * void *  ),
                                                            
int  ( * eqf) ( void * , void * ))
{
    
struct hashtable *h;
    unsigned 
int pindex, size = primes[0];
    
    
/* Check requested hashtable isn't too large */
    
if (minsize > (1u << 30)) 
                  
return  NULL;
    
/* Enforce size as prime */
    
for (pindex=0; pindex < prime_table_length; pindex++
    
...
     h 
= (struct hashtable *)malloc(sizeof(struct hashtable));
     
if (NULL == h) 
           
return NULL; /*oom*/

    h
->table = (struct entry **)malloc(sizeof(struct entry** size);
    
if (NULL == h->table)
    

                  free(h); 
                   
return NULL; 
    }
 /*oom*/
    memset(h
->table, 0, size * sizeof(struct entry *));

    h
->tablelength  = size;
    h
->primeindex   = pindex;
    h
->entrycount   = 0;
    h
->hashfn       = hashf;
    h
->eqfn         = eqf;
    h
->loadlimit    = (unsigned int) ceil(size * max_load_factor);
    
    
return h;
}


unsigned 
int  hash( struct  hashtable  * h,  void   * k)
{
    
/* Aim to protect against poor hash functions by adding logic here 
    - logic taken from java 1.4 hashtable source 
*/

    unsigned 
int i = h->hashfn(k);
         i 
+= ~(i << 9);
    i 
^=  ((i >> 14| (i << 18)); /* >>> */
          i 
+=  (i << 4);
    i 
^=  ((i >> 10| (i << 22)); /* >>> */
    
return i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值