#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<memory.h>
#define base_bkdrhash_value 131
typedef struct hashtable
{
struct hashtable *next;
char *key_str;
int fid;
}hashtable_t;
void htinit(hashtable_t** ht, int len)
{
int i=0;
for (i=0;i<len;i++)
{
ht[i] = (hashtable_t*)malloc(sizeof(hashtable_t));
memset(ht[i], 0, sizeof(hashtable_t));
}
ht[0]->fid = len;
}
int bkdrhash(char *key)
{
int seed = base_bkdrhash_value;
int hash = 0;
while(*key != '\n' && *key != 0)
{
hash = hash*seed + (*key++);
}
printf("bkdrhash hash = %d\n", hash);
return (hash & 0x7fffffff);
}
int htindex(char *key, hashtable_t** ht)
{
int htkey = bkdrhash(key);
printf("htindex htkey = %d\n", htkey);
int fid = ht[0]->fid -1;
//printf("htindex fid = %d\n", fid);
return (int)htkey%fid +1;
}
hashtable_t* htset(char *key, int fid, hashtable_t** ht)
{
printf("htset key = %s\n", key);
int index = htindex(key, ht);
printf("htset index = %d\n", index);
hashtable_t* item = ht[index];
while (item->next)
{
if ( 0 == strcmp(key, item->next->key_str))
{
item->next->fid = fid;
return 0;
}
item = item->next;
}
item->next = (hashtable_t*)malloc(sizeof(hashtable_t));
item->next->fid = fid;
item->next->key_str = key;
item->next->next = NULL;
return 0;
}
hashtable_t* htget(char *key, hashtable_t** ht)
{
printf("htget key = %s\n", key);
int index = htindex(key, ht);
printf("htget index = %d\n",index);
hashtable_t* item = ht[index]->next;
int i=0;
while (item)
{
printf("htget i = %d\n",i++);
if ( 0 == strcmp(key, item->key_str))
{
return item;
}
item = item->next;
}
return NULL;
}
int htdel(char *key, hashtable_t** ht)
{
printf("htdel key = %s\n", key);
int index = htindex(key, ht);
printf("htdel index = %d\n",index);
hashtable_t* item = ht[index];
hashtable_t* temp = NULL;
while (item->next)
{
if ( 0 == strcmp(key, item->next->key_str))
{
temp = item->next;
item->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
item = item->next;
}
return -1;
}
int htgetlen(hashtable_t** ht)
{
int alen = ht[0]->fid;
int i,length = 0;
for (i=1;i<alen;i++)
{
if (ht[i]->next)
{
length++;
}
}
return length;
}
int htcapacity(hashtable_t** ht)
{
return ht[0]->fid;
}
void printht(hashtable_t** ht)
{
int i;
int len = ht[0]->fid;
hashtable_t* item = NULL;
for (i=1;i<len;i++)
{
item = ht[i]->next;
while (item)
{
printf("%-10s = %6d\n", item->key_str, item->fid);
item = item->next;
}
}
}
void main()
{
hashtable_t *item[50];
htinit(item, 50);
htset("gsdb", 100, item);
htset("aaao", 10, item);
htset("aaaao", 10, item);
htset("bfaao", 2000, item);
htset("wilbur", 100, item);
htset("wyao", 1000, item);
printf("/***************/\n");
printht(item);
printf("/***************/\n");
hashtable_t *tmp = htget("wyao", item);
if (tmp)
printf("tmp %-10s = %6d\n", tmp->key_str, tmp->fid);
printf("/***************/\n");
htdel("aaao", item);
printf("/***************/\n");
printht(item);
printf("/***************/\n");
tmp = htget("aaao", item);
if (tmp)
printf("tmp %-10s = %6d\n", tmp->key_str, tmp->fid);
printf("/***************/\n");
tmp = htget("aaaaaao", item);
if (tmp)
printf("tmp %-10s = %6d\n", tmp->key_str, tmp->fid);
}
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash/hash]# gcc -o hash_table hash_table.c
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash/hash]# ./hash_table
htset key = gsdb
bkdrhash hash = 233540086
htindex htkey = 233540086
htset index = 11
htset key = aaao
bkdrhash hash = 219742262
htindex htkey = 219742262
htset index = 48
htset key = aaaao
bkdrhash hash = -1278536473
htindex htkey = 868947175
htset index = 41
htset key = bfaao
bkdrhash hash = -972796097
htindex htkey = 1174687551
htset index = 17
htset key = wilbur
bkdrhash hash = 741440725
htindex htkey = 741440725
htset index = 19
htset key = wyao
bkdrhash hash = 269612128
htindex htkey = 269612128
htset index = 17
/***************/
gsdb = 100
bfaao = 2000
wyao = 1000
wilbur = 100
aaaao = 10
aaao = 10
/***************/
htget key = wyao
bkdrhash hash = 269612128
htindex htkey = 269612128
htget index = 17
htget i = 0
htget i = 1
tmp wyao = 1000
/***************/
htdel key = aaao
bkdrhash hash = 219742262
htindex htkey = 219742262
htdel index = 48
/***************/
gsdb = 100
bfaao = 2000
wyao = 1000
wilbur = 100
aaaao = 10
/***************/
htget key = aaao
bkdrhash hash = 219742262
htindex htkey = 219742262
htget index = 48
/***************/
htget key = aaaaaao
bkdrhash hash = 2023274675
htindex htkey = 2023274675
htget index = 45
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash/hash]#