From 6060b590d3bf6b66624fef4982dfe6989e17b093 Mon Sep 17 00:00:00 2001 From: Mia Herkt Date: Wed, 7 Dec 2022 22:28:25 +0100 Subject: [PATCH] 07: C: Hash entries --- 07/solution.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/07/solution.c b/07/solution.c index 2adade7..323d35d 100644 --- a/07/solution.c +++ b/07/solution.c @@ -1,9 +1,19 @@ #include #include #include +#include + +uint32_t fnv1a_32(const char *buf, size_t len) +{ + uint32_t h = 0x811c9dc5U; + for (; len > 0; len--) + h = 0x01000193U * (h ^ *buf++); + + return h; +} typedef struct entry { - char *name; + uint32_t id; int isdir; size_t size; size_t n_entries; @@ -13,9 +23,10 @@ typedef struct entry { } entry; entry *findent(entry *e, int isdir, const char *name) { + uint32_t id = fnv1a_32(name, strlen(name)); for (size_t i = 0; i < e->n_entries; i++) { if (e->entries[i]->isdir == isdir) - if (!strcmp(e->entries[i]->name, name)) + if (e->entries[i]->id == id) return e->entries[i]; } @@ -33,9 +44,8 @@ entry *addent(entry *parent, int isdir, const char *name) { parent->n_entries++; entry *e = parent->entries[parent->n_entries - 1] = calloc(1, sizeof(entry)); + e->id = fnv1a_32(name, strlen(name)); e->isdir = isdir; - e->name = malloc(strlen(name) + 1); - strcpy(e->name, name); e->parent = parent; return e;