当前位置: 首页 >> 应用软件 >> 网络相关 >> Apache中的哈希表剖析(2)
 

Apache中的哈希表剖析(2)

作者:      来源:http://blog.csdn.net/tingya     发表时间:2006-03-06     浏览次数:      字号:    

1pt solid; HEIGHT: 17.25pt; BACKGROUND-COLOR: transparent" width=262 colSpan=2>

Not NULL
    从上表可以看出(1)-(4)图可以归结为一个大类,那就是this的直接后继都是为NULL,这导致this结点和next结点位于不同的索引链表中,而(5)则是另外一个大类,它的直接后继不为NULL,这导致this和next位于同一链表中。对于给定的this结点,如何获取它的下一个结点??Apache中使用apr_hash_next函数来获取this结点的下一个结点:
    APR_DECLARE(apr_hash_index_t *) apr_hash_next(apr_hash_index_t *hi)
    {
        hi->this = hi->next;
        while (!hi->this) {
            if (hi->index > hi->ht->max)
                return NULL;
            hi->this = hi->ht->array[hi->index++];
        }
        hi->next = hi->this->next;
        return hi;
    }
    this结点由传入参数hi指定,函数内部计算this的next结点,并继续通过hi返回出去。函数中正是利用了上面所说的分类规律:
    ■ while循环用于处理上图的(1)(2)(3)(4)四种情况,如果直接后继为NULL,则直接跳至下一个索引链表工作,直到索引为max为止。
    ■ hi->next=hi->this->next用以处理直接后继不为NULL的情况,那么此时只需要调整next就可以了。
    除了apr_hash_next之外,Apache中还提供了另外两个辅助函数apr_hash_first和ap_hash_this。apr_hash_first主要为遍历整个哈希表作必要的准备,并返回整个哈希表的第一个元素的索引结构apr_hash_index_t。该函数需要两个参数:内部索引分配所需要的内存池以及需要遍历的哈希表:
    APR_DECLARE(apr_hash_index_t *) apr_hash_first(apr_pool_t *p, apr_hash_t *ht)
    {
        apr_hash_index_t *hi;
        if (p)
            hi = apr_palloc(p, sizeof(*hi));
        else
            hi = &ht->iterator;
 
        hi->ht = ht;
        hi->index = 0;
        hi->this = NULL;
        hi->next = NULL;
        return apr_hash_next(hi);
    }
    函数的前半部分主要进行apr_hash_index_t结构的初始化工作,如果内部具有迭代子,那么直接使用该迭代子,否则创建新的迭代子,并使用该迭代子进行第一次迭代,apr_hash_next将返回哈希表中的第一个元素,同时下一个间接后继结点同时也返回。
    apr_hash_this函数主要返回给定结点的各种信息,通常情况下,总是将this指针传递个该函数:
    APR_DECLARE(void) apr_hash_this(apr_hash_index_t *hi,const void **key,
apr_ssize_t *klen,void **val)
    {
        if (key) *key = hi->this->key;
        if (klen) *klen = hi->this->klen;
        if (val) *val = (void *)hi->this->val;
    }

[1] [2] [3]

责任编辑 webmaster

 
发表评论  打印本文  推荐本文  加入收藏  返回顶部  关闭窗口
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •