Beispiel #1
0
//확장성 해시 인덱스 함수.
int extendible_Hash_Indexing(RECORD* recordPtr) {
	unsigned __int64 bitstringedKey;
	unsigned __int64 hashed_Key = hashFunc(recordPtr->name);
	int resultAdd;	//addToBucket 의 결과를 저장할 변수.
	BUCKET* targeted_Bkt = NULL;	//레코드가 들어갈 버켓 주소.

	//전역 깊이에 따라 들어온 키의 비트스트링을 잘라서 저장한다.
	bitstringedKey = bitstring(hashed_Key, global_Depth);

	targeted_Bkt = dir_Ptr[bitstringedKey].bktPtr;

	if (targeted_Bkt == NULL) return -1;	//매치되는 비트스트링이 디렉토리에 없는 경우. 정상적인 환경에서는 있을 수 없는 경우.

	resultAdd = add_To_Bucket(targeted_Bkt, recordPtr);

	if (resultAdd == 0);

	//버킷이 오버플로우 된 경우 split.
	else if (resultAdd == BKT_OVERFLOW) {
		if (bkt_Split(targeted_Bkt) == -1) {
			printf("Memory realloc 과정중 오류가 생겼습니다.\n 충분한 메모리를 확보 후 다시 실행하십시오.\n");
			return -1;
		}
		extendible_Hash_Indexing(recordPtr);
	}

	else return 0;
}
Beispiel #2
0
//버켓을 스플릿 할 경우.
int bkt_Split(BUCKET* bktPtr) {
	printf("Bucket(%d) is splitted.\n", (int)(bktPtr - bkt_Ptr)+1);
	BUCKET tmpBkt;
	BUCKET* tmpBktPtr = NULL;
	BUCKET* tmpPtr = NULL;
	int count=0;

	//로컬 깊이 == 전역 길이 일 경우, doubling directory.
	if (bktPtr->local_Depth == global_Depth) {
		if(dir_Double(bktPtr)==-1) return -1;
	}

	bkt_Count++;
	bktPtr->local_Depth++;
	tmpBkt = *bktPtr;
	for (int i = 0; i < MAX_BUCKET; i++) bktPtr->record_Ptr[i] = NULL;
	/*-----------------------------------------------------------------------------------------------
	해당 버켓을 스플릿 시킨다. 버켓의 배열을 +1 시킨 배열로 realloc.
	이렇게 1씩 증가시키는 realloc 은 복잡도가 O(n^2) 로 간다. 기존의 원소들을 모두 복사하기 때문이다.
	그러므로 비효율적이다.
	-----------------------------------------------------------------------------------------------*/
	tmpPtr = (BUCKET*)realloc(bkt_Ptr, sizeof(BUCKET) * bkt_Count);
	if (tmpPtr == NULL) {
		printf("Error_realloc.\n");
		return -1;
	}
	bkt_Ptr = tmpPtr;
	//새 버킷의 로컬 깊이를 스플릿을 야기한 버킷 로컬깊이 + 1 과 같게 한다.
	bkt_Ptr[bkt_Count - 1].local_Depth = tmpBkt.local_Depth;
	bkt_Ptr[bkt_Count - 1].key = tmpBkt.key + pow(2, tmpBkt.local_Depth - 1);

	//새 버켓의 레코드를 초기화한다.
	for (int i = 0; i < MAX_BUCKET; i++) bkt_Ptr[bkt_Count - 1].record_Ptr[i] = NULL;
	
	//realloc에 의해 bkt_Ptr의 주소가 바뀌었을 경우 디렉토리인덱스 내의 주소를 동기화시켜준다.
	if (bkt_Ptr != dir_Ptr[0].bktPtr) {
		for (int j = 0; j < bkt_Count; j++) {
			dir_Ptr[bkt_Ptr[j].key].bktPtr = &bkt_Ptr[j];
			if (bkt_Ptr[j].local_Depth < global_Depth) {
				for (int i = 0; i < pow(2,global_Depth - bkt_Ptr[j].local_Depth) - 1; i++)
					dir_Ptr[bkt_Ptr[j].key + (i + 1) * pow(2,bkt_Ptr[j].local_Depth)].bktPtr = &bkt_Ptr[j];
			}
		}
	}
	
	//새로 추가된 버킷에 연결될 디렉토리 인덱스를 연결한다.
	for (int i = 0; i < dir_Max; i++) {
		if(bitstring(i,bkt_Ptr[bkt_Count-1].local_Depth)==bkt_Ptr[bkt_Count-1].key) 
			dir_Ptr[i].bktPtr = &bkt_Ptr[bkt_Count - 1];
	}

	//스플릿을 발생시킨 버켓의 레코드들을 재배치시킨다.
	for (int j = 0; j < MAX_BUCKET; j++)	
		extendible_Hash_Indexing(tmpBkt.record_Ptr[j]);
	return 0;
}
DataExtraction::DataExtraction()
{
	srand ( time(NULL) );
	size_t size=10;
	data=vector<bitstring>(1,bitstring(size));

	//cout<<"bitstring:";

	for (int i=0;i<size;i++)
	{
		data[0][i]=rand() % 2;
		//cout<<data[0][i];
	}
	//cout<<endl<<endl;
}
vector<bitstring > LookAheadExtractor::extractBAK(bitstring w, bitstring x) {


	cout <<"LookAheadExtractor ::w.size() =" << w.size()<<"n = "<< n <<endl;
	cout <<"LookAheadExtractor ::x.size() =" << x.size()<<"d = "<< d <<endl;
	if (w.size() != (size_t)n) {
		throw invalid_argument("LookAheadExtractor::W has wrong size");
	}
/*	if (x.size() != (size_t)d) { // if (x.size() != (size_t)d) {
		throw invalid_argument("LookAheadExtractor::X has wrong size");
	}
*/
	
	//int nw = n, kw = k, nq = d - l;	
	
	//Extractor extw(NW, KQ , DW, LW, 0), extq(NQ, KQ, DQ, LQ, 0); // 2 * l * t


	/*
	 * criar uma Mask com tamanhos necessarios para extq e extw
	 * 
	 *
	 */
	cout <<"here goes the substitute of the extractor (LookAheadExtractor.cpp line 61)\n";
	//extq=Mask(NW,DW,LW,);
	//extq=Mask(NQ,DQ,LQ,);

	srand(time(0));
	int delta =(int) rand()%15;
	vector<bitstring > result;


	
	bitstring q = x.subbits(256); //TODO GENERALIZAR O 256
	bitstring si = x.subbits(0, 256); //TODO IDEM.
	
		
	
	Mask msk_w = Mask(256,w,si,12);// TODO idem
	msk_w.creat_mask();
	vector<bitstring> extw_S = msk_w.S; // TODO vector needed. needs to be sent as an argument.
	
	bitstring ri= msk_w.extract();
	cout << "ext_Q size "<<q.size()<<endl;
	Mask msk_q = Mask(256,q,ri,12); 
// TODO idem + falta adicionar o X a funcao.
	msk_q.creat_mask();
	vector<bitstring> extq_S = msk_q.S; // TODO this vector is needed before the cicle. NEEDS TO BE SENT AS ARGUMENT
	
	
	result.push_back(ri);	 

	
	Mask temp_extq;
	Mask temp_extw;
	bitstring sit;
	bitstring rit;
	for (int i = 2; i <= t; ++i) {
		//cout<< "INTERACTION nº:"<<i <<endl;//" si = extq.extract(q, ri);\n";
		//cout<< "                        ri = extw.extract(w, si);\n";
		
		temp_extq = Mask(256,q,ri,extq_S,12);
		
		si= temp_extq.extract();//TODO o extract recebe argumentos mas n os usa. mudar isso.
		sit = bitstring(si);
		temp_extw = Mask(256,w,sit,extw_S,12);
		
		ri=msk_w.extract();
		rit=ri.subbits(0,ri.size());
		result.push_back(rit);
		
	}
	
	//cout <<"lookahead::extract result =" << (result.first).to_string()<<endl; 
	return result;
}