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