//확장성 해시 인덱스 함수. 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; }
//버켓을 스플릿 할 경우. 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; }