使用RSHash进行hash处理
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 100
struct person
{
char *name;
int age;
};
struct store_person
{
struct person *per;
struct store_person *next;
const char *key;
};
struct store_person *stuff;
unsigned int RSHash(const char *str);
void hash_set(const char *key, struct person *per);
struct person* hash_get(const char *key);
void freesource();
int main(int argc, char *argv[])
{
stuff = (struct store_person*)malloc(sizeof(struct store_person) * MAX_NUM);
if(stuff == NULL)
return -1;
struct person pvalue1;
pvalue1.name = "haha";
pvalue1.age = 18;
hash_set("key1", &pvalue1);
struct person pvalue2;
pvalue2.name = "xixi";
pvalue2.age = 20;
hash_set("key2", &pvalue2);
struct person pvalue3;
pvalue3.name = "lala";
pvalue3.age = 12;
hash_set("key3", &pvalue3);
struct person *p = hash_get("key2");
printf("person->name=%s and person->age=%d\n", p->name,p->age);
freesource();
return 0;
}
unsigned int RSHash(const char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;
while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7FFFFFFF);
}
void hash_set(const char *key, struct person *per)
{
int pos = RSHash(key) % MAX_NUM;
struct store_person *store = &stuff[pos];
if(store->key == NULL)
{
store->key = key;
store->per = per;
printf("store ok ,position is %d\n", pos);
return;
}
}
struct person* hash_get(const char *key)
{
int pos = RSHash(key) % MAX_NUM;
struct store_person *store = &stuff[pos];
if(store->key != NULL)
{
return (store->per);
}
}
void freesource()
{
free(stuff);
stuff = NULL;
printf("free ok\n");
}
有关hash函数,请参考前一篇