larbin源码分析(四) hashTable类对象的实现

larbin源码分析(四) hashTable类对象的实现

 larbin源码分析(四)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 = creat("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来进行存储。


你可能感兴趣的:(larbin源码分析(四) hashTable类对象的实现)