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来进行存储。

posted on 2011-10-24 15:58  zhoulinhu  阅读(275)  评论(0编辑  收藏  举报

导航