Larbin源代码分析[4]HASHTABLE类对象的实现
一 hashTable类对象
作用:爬虫将爬取的url存储在该类对象中,存储方式是,url对象的hashcode,映射到对应的表项中。
其中每一个url,映射成对应table中的一个bit,其中表空间大小为 64000000(单位为bit),大小的定义存储在types.h头文件中。
爬去到的url需要在hashTable中进行一次查找,若是不存在,则进行进一步遍历。已经存在,则不需要遍历。
二 成员函数
HashTable(bool created ) 构造函数
~HashTable() 析构函数
save() ; 将hashTable存储在文件中。
test(url * U) ;判断对应的url是否在hashTable 中
set(url * u) ; 将hashTable对应的URL ,设置称当前的。
testset(url* u) 如果已经添加返回true 。若是之前已经存在返回false
三 实现
(1) HashTable(bool created)
当created为true的时候,表示不需要从文件中读取,直接进行初始化,将table区域全部初始化为0即可。
若created为false的时候,表示需要从文件hashtable.bak中读取存储的数据,将其存放进hashtable类中的table缓冲区中。
(2) save() 函数实现
rename("hashtable.bak", "hashtable.old"); //将hashtable.bak文件存储在临时文件hashtable.old中
int fds = create("hashtable.bak", 00600); //新创建hashtable.bak文件
if (fds >= 0) {
ecrireBuff(fds, table, hashSize/8); //将hashtable写入文件
close(fds); //关闭操作
}
unlink("hashtable.old"); //对hashtable.old进行解链操作
(3) bool test(url * U) //判断url是否在hashtable中
{
int code = U->hashcode() ; //调用url的hashcode函数。
int pos = code / 8 ; //每一个url在hashtable中即为一个url
int index = 1 << code % 8 ;
return table[pos] & index
}
(4) hashTable::set (url *U) //将对应的一个URL插入进hashtable中
{
int code = U->hashcode() ; //调用url的hashcode函数。
int pos = code / 8 ; //每一个url在hashtable中即为一个url
int index = 1 << code % 8 ;
table[pos] |= index ;
}
(5) bool hashTable::testSet (url *U) { //若已经存在此url则返回false,不存在则完成插入,然后返回true
int code = U->hashcode() ; //调用url的hashcode函数。
int pos = code / 8 ; //每一个url在hashtable中即为一个url
unsigned int index = 1 << code % 8 ;
int res = table[pos] & index ;
table[pos] |= index ;
return !res ;
}
四 总结
hashTable 用来存储爬去下来的url,若是已经存在则不进行插入。每一个url使用一个bit来进行存储。