larbin源碼分析(五) hashDup類對象的實現(xiàn)
一 類的成員變量及主要功能
(1) 成員變量
ssize_t size; //表示hash 表的大小
char *table; //表示hash存儲區(qū)域
char *file; //表示存儲的文件,內(nèi)存中的hash表可以保存在外部磁盤中
(2) 主要功能
該類和hashTable代碼比較相似,但是hashTable處理的是url去重,而hashDup處理的是網(wǎng)頁內(nèi)容的去重,
不會對完全相同的網(wǎng)頁進行爬取,但是不保證相似網(wǎng)頁的排重。改進的一個方向。
二 具體的成員函數(shù)
構(gòu)造函數(shù)
hashDup (ssize_t size, char *init, bool scratch); size表示hash表的大小,單位為bit。
init參數(shù)表示 hash表存儲在磁盤的文件名稱。scratch若為true表示重新構(gòu)建hash表,
若為false,則表示需要從磁盤文件中讀取hash表。
~hashDup()函數(shù) 具體操作為 情況table內(nèi)存。
下面主要講解網(wǎng)頁內(nèi)容去重的函數(shù)
bool hashDup::testSet (char *doc) { //doc應該為網(wǎng)頁的具體內(nèi)容 ,依次順序遍歷網(wǎng)頁內(nèi)容,對其中A與z之間的字符進行驗證
unsigned int code = 0;
char c;
for (uint i=0; (c=doc[i])!=0; i++) {
if (c>'A' && c<'z')
code = (code*23 + c) % size;
}
unsigned int pos = code / 8; //具體的判斷函數(shù),若是執(zhí)行插入返回true,否則返回false
unsigned int bits = 1 << (code % 8);
int res = table[pos] & bits;
table[pos] |= bits;
return !res;
}
save()函數(shù)
主要的作用就是,將table區(qū)域中的數(shù)據(jù),存儲在外部磁盤中,進行持久化操作。
三 總結(jié)
該類為網(wǎng)頁內(nèi)容去重hash函數(shù)的具體實現(xiàn)。