Hash fonction just for fun.
This commit is contained in:
parent
70ae216122
commit
4e12ff1c94
15
src/util.c
15
src/util.c
@ -396,7 +396,7 @@ void list_append(list_t *src, list_t *dest)
|
|||||||
struct hash_item {
|
struct hash_item {
|
||||||
char *key;
|
char *key;
|
||||||
void *item;
|
void *item;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int hash_item_nocase_cmp(struct hash_item *a, char *b)
|
static int hash_item_nocase_cmp(struct hash_item *a, char *b)
|
||||||
{
|
{
|
||||||
@ -453,12 +453,15 @@ hash_t *hash_new(int options)
|
|||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Now we have a real hash, but we use only the last byte of it :p */
|
||||||
static unsigned char hash_func(char *pkey)
|
static unsigned char hash_func(char *pkey)
|
||||||
{
|
{
|
||||||
unsigned char i = 0;
|
char c;
|
||||||
while (*pkey)
|
unsigned long hash = 5381; /* 5381 & 0xff makes more sense */
|
||||||
i += (unsigned char)toupper(*pkey++);
|
|
||||||
return i;
|
while (c = *pkey++)
|
||||||
|
hash = ((hash << 5) + hash) ^ c;
|
||||||
|
return (unsigned char)hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hash_insert(hash_t *hash, char *key, void *ptr)
|
void hash_insert(hash_t *hash, char *key, void *ptr)
|
||||||
@ -467,7 +470,7 @@ void hash_insert(hash_t *hash, char *key, void *ptr)
|
|||||||
|
|
||||||
if (hash_get(hash, key))
|
if (hash_get(hash, key))
|
||||||
fatal("Element with key %s already in hash %x\n", key, hash);
|
fatal("Element with key %s already in hash %x\n", key, hash);
|
||||||
|
|
||||||
it = malloc(sizeof(struct hash_item));
|
it = malloc(sizeof(struct hash_item));
|
||||||
if (!it)
|
if (!it)
|
||||||
fatal("malloc");
|
fatal("malloc");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user