Explorar el Código

hashmaps are now working

banana-cakes
FelixBrendel hace 7 años
padre
commit
854593273f
Se han modificado 1 ficheros con 4 adiciones y 55 borrados
  1. +4
    -55
      hashmap.hpp

+ 4
- 55
hashmap.hpp Ver fichero

@@ -43,53 +43,19 @@ u32 hash(char* str) {
value = (10000003 * value) ^ str[i++]; value = (10000003 * value) ^ str[i++];
} }
return value ^ i; return value ^ i;

// unsigned long hash = 5381;
// int c;

// while (c = *str++)
// hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

// return hash;

// int result = 0x55555555;

// while (*str) {
// result ^= *str++;
// // result = (result << 5) | (result >> (32 - 5)) & ~((-1 >> 5) << 5);
// // result = rol(result, 5);
// }

// return result;

// uint32_t hash, i;
// for(hash = i = 0; str[i]; ++i)
// {
// hash += str[i];
// hash += (hash << 10);
// hash ^= (hash >> 6);
// }
// hash += (hash << 3);
// hash ^= (hash >> 11);
// hash += (hash << 15);
// return hash;
} }


StringHashMap* create_hashmap(int initial_capacity = 8) { StringHashMap* create_hashmap(int initial_capacity = 8) {
printf("1aeaeae\n");
StringHashMap* hm = new StringHashMap; StringHashMap* hm = new StringHashMap;
hm->current_capacity = initial_capacity; hm->current_capacity = initial_capacity;
hm->cell_count = 0; hm->cell_count = 0;
// set all data to nullptr // set all data to nullptr
hm->data = (StringHashMapCell *)calloc(initial_capacity, sizeof(StringHashMapCell*));
hm->data = (StringHashMapCell *)calloc(initial_capacity, sizeof(StringHashMapCell));
// printf("check: %s\n", hm->data[6].original_string); // printf("check: %s\n", hm->data[6].original_string);
printf("after creating...\n");
print_hm(hm);
return hm; return hm;
} }


int hm_get_index_of_living_cell_if_it_exists(StringHashMap* hm, char* key, u64 hash_val) { int hm_get_index_of_living_cell_if_it_exists(StringHashMap* hm, char* key, u64 hash_val) {
printf("2aeaeae\n");
int index = hash_val % hm->current_capacity; int index = hash_val % hm->current_capacity;
StringHashMapCell cell = hm->data[index]; StringHashMapCell cell = hm->data[index];
// test if cell exists at that index // test if cell exists at that index
@@ -150,20 +116,12 @@ inline void hm_delete_object(StringHashMap* hm, char* key) {
} }


void hm_set(StringHashMap* hm, char* key, void* obj) { void hm_set(StringHashMap* hm, char* key, void* obj) {
printf(" -------------\n");
printf("before...\n");
print_hm(hm);

u64 hash_val = hash(key); u64 hash_val = hash(key);
int index = index = hash_val % hm->current_capacity;
int index = hash_val % hm->current_capacity;


// if we the desired cell is just empty, write to it and done :) // if we the desired cell is just empty, write to it and done :)
printf(" setting: %s\n", key);
printf(" capacity: %d\n", hm->current_capacity);
printf(" index: %d\n", index);
if (!hm->data[index].original_string) { if (!hm->data[index].original_string) {
// insert new cell into desired slot // insert new cell into desired slot
printf("alles paletti\n");
++hm->cell_count; ++hm->cell_count;
} else { } else {
if (strings_match(key, hm->data[index].original_string)) { if (strings_match(key, hm->data[index].original_string)) {
@@ -173,9 +131,8 @@ void hm_set(StringHashMap* hm, char* key, void* obj) {
// collision, check resize // collision, check resize
++hm->cell_count; ++hm->cell_count;
if ((hm->cell_count*1.0f / hm->current_capacity) > 0.666f) { if ((hm->cell_count*1.0f / hm->current_capacity) > 0.666f) {
printf("!!!reallocation\n");
StringHashMapCell* old_data = hm->data; StringHashMapCell* old_data = hm->data;
hm->data = (StringHashMapCell*)calloc(hm->current_capacity*4, sizeof(StringHashMapCell*));
hm->data = (StringHashMapCell*)calloc(hm->current_capacity*4, sizeof(StringHashMapCell));
hm->cell_count = 0; hm->cell_count = 0;
hm->current_capacity *= 4; hm->current_capacity *= 4;


@@ -187,41 +144,33 @@ void hm_set(StringHashMap* hm, char* key, void* obj) {
} }
} }
free(old_data); free(old_data);
index = hash_val % hm->current_capacity;
} }
// search for empty slot for new cell starting at desired index; // search for empty slot for new cell starting at desired index;
// preventing gotos using lambdas! // preventing gotos using lambdas!
[&](){ [&](){
for (int i = index; i < hm->current_capacity; ++i) { for (int i = index; i < hm->current_capacity; ++i) {
printf(" checking free index: %d\n", i);
if (!hm->data[i].original_string || if (!hm->data[i].original_string ||
strings_match(hm->data[i].original_string, key)) strings_match(hm->data[i].original_string, key))
{ {
index = i; index = i;
return; return;
} else {
printf("-> not free, found %s\n", hm->data[i].original_string);
} }
} }
for (int i = 0; i < index; ++i) { for (int i = 0; i < index; ++i) {
printf(" checking free index: %d\n", i);
if (!hm->data[i].original_string || if (!hm->data[i].original_string ||
strings_match(hm->data[i].original_string, key)) strings_match(hm->data[i].original_string, key))
{ {
index = i; index = i;
return; return;
} else {
printf("-> not free, found %s", hm->data[i].original_string);
} }
} }
}(); }();
} }
} }


printf (" writing at index: %d\n", index);
hm->data[index].deleted = false; hm->data[index].deleted = false;
hm->data[index].original_string = key; hm->data[index].original_string = key;
hm->data[index].hash = hash_val; hm->data[index].hash = hash_val;
hm->data[index].object = obj; hm->data[index].object = obj;
printf("after...\n");
print_hm(hm);
} }

Cargando…
Cancelar
Guardar