Exemple #1
0
void Hash::resolveBucketOverflow(Bucket* overflowedBucket, int bucketNumber, int referenceNumber)
{
	//se crea un nuevo bucket
	Bucket* newBucket = new Bucket(this->bucketSize);
	int newBucketNumber = this->findNewBlock();

	//Actualiza el factor de dispersion
	int originalDispersionNumber = overflowedBucket->getDispersionNumber();
	overflowedBucket->setDispersionNumber(2 * originalDispersionNumber);
	newBucket->setDispersionNumber(2 * originalDispersionNumber);

	bool duplicate = (originalDispersionNumber == this->hashTable->getSize());
	if(duplicate)
		this->hashTable->duplicateTable(referenceNumber, newBucketNumber);
	else
		this->hashTable->updateReferences(referenceNumber, overflowedBucket->getDispersionNumber(), newBucketNumber);

	this->reHashRecords(overflowedBucket, bucketNumber, newBucket);
	this->blockPersistor->saveBlock(bucketNumber, overflowedBucket->Serialize());
	this->blockPersistor->saveBlock(newBucketNumber, newBucket->Serialize());
	delete newBucket;
}