From 05540fc6038f452f5dc5f18412c918c33ad96027 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Thu, 16 Feb 2023 14:32:56 -0800 Subject: changed project structure --- src/hashtable.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/hashtable.c (limited to 'src/hashtable.c') diff --git a/src/hashtable.c b/src/hashtable.c new file mode 100644 index 0000000..7cb253c --- /dev/null +++ b/src/hashtable.c @@ -0,0 +1,39 @@ +#include +#include +#include "hashtable.h" + +const unsigned int fnvPrime = 16777619; +const unsigned int fnvOffset = 2166136261U; + +pair_t* init_pair(char* key, void* value) { + pair_t* p = malloc(sizeof(pair_t)); + p->key = key; + p->value = value; + return p; +} +hashtable_t* init_hashtable(unsigned int capacity) { + hashtable_t* ht = malloc(sizeof(hashtable_t)); + ht->pairs = calloc(capacity, sizeof(pair_t*)); + ht->capacity = capacity; + return ht; +} +//FNV-1a hash +unsigned int get_hash(char* str) { + unsigned int hash = fnvOffset; + while (*str != '\0') { + hash = (hash ^ *str) * fnvPrime; + str++; + } + return hash; +} +/* TODO: handle collision +TODO: return 0 if something goes wrong */ +unsigned int hashtable_add_pair(hashtable_t* hashtable, pair_t* pair) { + unsigned int hash = get_hash(pair->key); + hashtable->pairs[hash % hashtable->capacity] = pair; + return hash; +} +pair_t* hashtable_get_pair(hashtable_t* hashtable, char* key) { + unsigned int hash = get_hash(key); + return hashtable->pairs[hash % hashtable->capacity]; +} -- cgit v1.3.1