Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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));
	}
}