diff options
| author | tslil clingman <tslil@posteo.de> | 2021-01-23 20:48:34 -0500 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-08-28 19:37:41 +0100 |
| commit | 93f66971f66c14f18aba743b6d0f8b0f557351ca (patch) | |
| tree | 1568304dd2c33e03a7ecd4b84b4ba48b03670731 /include/cnn1986_cache.c | |
| parent | 9eb1a379853b088df0ab3a4beae4e79eaead4823 (diff) | |
Hash collisions
Diffstat (limited to 'include/cnn1986_cache.c')
| -rw-r--r-- | include/cnn1986_cache.c | 51 |
1 files changed, 15 insertions, 36 deletions
diff --git a/include/cnn1986_cache.c b/include/cnn1986_cache.c index d9545ac..692920a 100644 --- a/include/cnn1986_cache.c +++ b/include/cnn1986_cache.c @@ -4,9 +4,11 @@ #define DATA_COUNT_SHIFT (DATA_STONE_SHIFT+2) #define COLOUR_MASK 0x3F // 0b00111111 -uint32_t cnn1986_num_cached, cnn1986_max_num_cached; +uint32_t cnn1986_num_cached, cnn1986_max_num_cached = 1000000; node_t *head = NULL, *tail = NULL; +int cnn1986_cache_init(void) { return EXIT_SUCCESS; } + void cnn1986_cache_free(void) { node_t *c = head, *n; while (c) { @@ -18,37 +20,22 @@ void cnn1986_cache_free(void) { tail = NULL; } -int cnn1986_cache_seek(float *out_result) { +int cnn1986_cache_seek(const uint64_t key[4], + float *out_result) { node_t *c = head; - - if (c == NULL) return EXIT_FAILURE; - - uint8_t comp_data[25], fail; - for (int k=0; k<25; k++) { - comp_data[k] = (colours[k] & COLOUR_MASK) - | (STONE_AT(k) << DATA_STONE_SHIFT) - | (COUNT_AT(k) << DATA_COUNT_SHIFT); - } - - // We've checked c = head already, so uncoditionally test it - do { - // Compare - fail = 0; - if (c->black_count == black_count && c->white_count == white_count) { - for (int k=0; k<25; k++) { - if (comp_data[k] != c->data[k]) { - fail = 1; - break; - } + while (c != NULL) { + // Either seek next or move to front and return + uint8_t fail = 0; + for (int k=0; k<4; k++) { + if (c->key[k] != key[k]) { + fail = 1; break; } - } else { fail = 1; } + } - // Either seek next or move to front and return if (fail) { c = c->next; } else { *out_result = c->result; - // Move to front if (c != head) { if (tail == c) tail=c->prev; @@ -59,16 +46,14 @@ int cnn1986_cache_seek(float *out_result) { head->prev = c; head = c; } - return EXIT_SUCCESS; } - } while (c); - + } // Failed to find it return EXIT_FAILURE; } -int cnn1986_cache_insert(float in_result) { +int cnn1986_cache_insert(const uint64_t key[4], float in_result) { node_t *new = malloc(sizeof(node_t)); if (new == NULL) return EXIT_FAILURE; // TODO: check errno @@ -76,14 +61,8 @@ int cnn1986_cache_insert(float in_result) { new->next = head; if (head) head->prev = new; head = new; + for (int k=0; k<4; k++) new->key[k] = key[k]; new->result = in_result; - new->white_count = white_count; - new->black_count = black_count; - for (int k=0; k<25; k++) { - new->data[k] = (colours[k] & COLOUR_MASK) - | (STONE_AT(k) << DATA_STONE_SHIFT) - | (COUNT_AT(k) << DATA_COUNT_SHIFT); - } if (cnn1986_num_cached == 0) tail = new; cnn1986_num_cached++; |
