void mt_hash_insert(MtHash* hash, MtString* key, void* value) { assert(hash != NULL); assert(key != NULL); if (key->hash == 0) key->hash = Murmur3(mt_string_get_utf8(key), mt_string_get_length(key)); mt_hash_insert_pair(hash, mt_pair_new(key, value)); }
void mt_hash_insert(MtHash* hash, MtString* key, void* value) { assert(hash != NULL); assert(key != NULL); if (key->hash == 0) key->hash = Murmur3(mt_string_get_utf8(key), mt_string_get_length(key)); size_t index = key->hash % hash->size; MtHashElement* element = &hash->buckets[index]; assert(element != NULL); // Collision handling if (element->data != NULL) { if (element->is_tree) { // Collision, tree already made mt_tree_insert((MtTree *) element->data, key, value); } else { // First collision, make a tree MtPair* pair = element->data; element->data = mt_tree_new(); mt_tree_move_pair((MtTree *) element->data, pair); ++hash->length; mt_tree_insert((MtTree *) element->data, key, value); element->is_tree = true; } } // No collision else { element->data = mt_pair_new(key, value); ++hash->length; if (hash->length >= 0.75 * hash->size) mt_hash_double_size(hash); } }