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;