void hash_table_print_info(struct hash_table *hash) { int collisions; collisions=hash_table_get_collisions(hash); printf("Size: %d\n",hash_table_get_size(hash)); printf("Used: %d\n",hash_table_get_used(hash)); printf("Load: %.3f\n",hash_table_get_load(hash)); printf("Collisions: %d\n",collisions); printf("Collision Rate: %.3f\n",(float)collisions/(float)hash->used); }
void hash_table_insert(struct hash_table *hash, void *data, size_t size) { struct hash_element *element; element=(struct hash_element*)xmalloc(sizeof(*element)); element->data=data; element->hash=hash->hash_fun(data,size); set_hash_element(hash,element); hash->used++; if (hash->resize_load > 0.0 && hash_table_get_load(hash) >= hash->resize_load) hash_table_resize(hash,hash->resize_load); }
void hash_table_set(hash_table *t, const char *key, int value) { if (hash_table_get_load(t) >= HASH_TABLE_MAX_LOAD_FACTOR) { hash_table replacement = hash_table_new_size(vector_size(&t->buckets) * 2); for (size_t i = 0; i < vector_size(&t->buckets); i++) { vector *bucket = vector_get(&t->buckets, i); for (size_t j = 0; j < vector_size(bucket); j++) { hash_table_entry *e = vector_get(bucket, j); replacement.entries++; vector_append(hash_table_get_bucket(&replacement, e->key), e); } } hash_table_adopt(t, &replacement); } vector *b = hash_table_get_bucket(t, key); hash_table_entry *e = hash_table_get_entry(b, key); if (e) { e->value = value; } else { t->entries++; vector_append(b, hash_table_entry_new(key, value)); } }