void HashTable_Rehash(wHashTable* table, long numOfBuckets) { int index; long hashValue; wKeyValuePair* pair; wKeyValuePair* nextPair; wKeyValuePair** newBucketArray; if (numOfBuckets == 0) numOfBuckets = calculateIdealNumOfBuckets(table); if (numOfBuckets == table->numOfBuckets) return; /* already the right size! */ newBucketArray = (wKeyValuePair**) malloc(numOfBuckets * sizeof(wKeyValuePair*)); if (newBucketArray == NULL) { /* Couldn't allocate memory for the new array. This isn't a fatal * error; we just can't perform the rehash. */ return; } for (index = 0; index < numOfBuckets; index++) newBucketArray[index] = NULL; for (index = 0; index < table->numOfBuckets; index++) { pair = table->bucketArray[index]; while (pair != NULL) { nextPair = pair->next; hashValue = table->hashFunction(pair->key) % numOfBuckets; pair->next = newBucketArray[hashValue]; newBucketArray[hashValue] = pair; pair = nextPair; } } free(table->bucketArray); table->bucketArray = newBucketArray; table->numOfBuckets = numOfBuckets; }
void HashTableRehash(HashTable *hashTable, long numOfBuckets) { KeyValuePair **newBucketArray; int i; assert(numOfBuckets >= 0); if (numOfBuckets == 0) numOfBuckets = calculateIdealNumOfBuckets(hashTable); if (numOfBuckets == hashTable->numOfBuckets) return; /* already the right size! */ newBucketArray = (KeyValuePair **) malloc(numOfBuckets * sizeof(KeyValuePair *)); if (newBucketArray == NULL) { /* Couldn't allocate memory for the new array. This isn't a fatal * error; we just can't perform the rehash. */ return; } for (i=0; i<numOfBuckets; i++) newBucketArray[i] = NULL; for (i=0; i<hashTable->numOfBuckets; i++) { KeyValuePair *pair = hashTable->bucketArray[i]; while (pair != NULL) { KeyValuePair *nextPair = pair->next; long hashValue = hashTable->hashFunction(pair->key) % numOfBuckets; pair->next = newBucketArray[hashValue]; newBucketArray[hashValue] = pair; pair = nextPair; } } free(hashTable->bucketArray); hashTable->bucketArray = newBucketArray; hashTable->numOfBuckets = numOfBuckets; }