static void BaseUtilTest() { assert(roundToPowerOf2(0) == 1); assert(roundToPowerOf2(1) == 1); assert(roundToPowerOf2(2) == 2); assert(roundToPowerOf2(3) == 4); assert(roundToPowerOf2(15) == 16); assert(roundToPowerOf2((1 << 13) + 1) == (1 << 14)); assert(roundToPowerOf2(MAX_SIZE_T) == MAX_SIZE_T); assert(murmur_hash2(NULL, 0) == 0x342CE6C); assert(murmur_hash2("test", 4) != murmur_hash2("Test", 4)); }
void* getHashtable(Hashtable* hashTable,HashKey key){ int index,hashcode; HashElement* element=NULL; assert(hashTable); if(hashTable->hashType == HASH_TYPE_NUMBER){ hashcode=key.i; } else if(hashTable->hashType == HASH_TYPE_STRING){ hashcode = (uint64_t)murmur_hash2(key.v,strlen(key.v)); } index = hashcode % hashTable->capacity; element = hashTable->elements[index]; while(element){ bool equal; if(hashTable->hashType == HASH_TYPE_NUMBER){ equal = element->key.i == key.i; } else if(hashTable->hashType == HASH_TYPE_STRING){ equal = element->key.v == key.v; } if(equal) return element->value; else{ element = element->next; } } return NULL; }
void removeHashtable(Hashtable* hashTable,HashKey key){ int index,hashcode; HashElement* element=NULL; HashElement* preElement=NULL; assert(hashTable); if(hashTable->hashType == HASH_TYPE_NUMBER){ hashcode=key.i; } else if(hashTable->hashType == HASH_TYPE_STRING){ hashcode = (uint64_t)murmur_hash2(key.v,strlen(key.v)); } index = hashcode % hashTable->capacity; element = hashTable->elements[index]; while(element){ bool equal; if(hashTable->hashType == HASH_TYPE_NUMBER){ equal = element->key.i == key.i; } else if(hashTable->hashType == HASH_TYPE_STRING){ equal = element->key.v == key.v; } if(equal){ if(preElement) preElement->next = element->next; else{ hashTable->elements[index] = element->next; } hashTable->size--; free(element); break; } else{ preElement = element; element = element->next; } } //free element }
int insertHashtable(Hashtable* hashTable,HashKey key,char* value){ int index; uint64_t hashcode; HashElement* element=NULL; assert(hashTable); assert(value); reHashTable(hashTable); if(hashTable->hashType == HASH_TYPE_NUMBER){ hashcode=key.i; } else if(hashTable->hashType == HASH_TYPE_STRING){ hashcode = (uint64_t)murmur_hash2(key.v,strlen(key.v)); } index = hashcode % hashTable->capacity; element = hashTable->elements[index]; if(element){ while(element->next){ element = element->next; } element->next = (HashElement*)malloc(sizeof(HashElement)); if(!element->next) return 0; element->next->key=key; element->next->value=value; element->next->next=NULL; hashTable->size++; } else{ hashTable->elements[index] = (HashElement*)malloc(sizeof(HashElement)); if(!hashTable->elements[index]) return 0; hashTable->elements[index]->key=key; hashTable->elements[index]->value=value; hashTable->elements[index]->next=NULL; hashTable->size++; } return 1; }
static unsigned int svr_req_hash(void* id) { return murmur_hash2(id, sizeof(unsigned int)); }