关于uthash 的初步源码阅读

背景:

在偶然的mqtt(mosquitto)中的源码中查看的关于topic的处理,知道了哈希表这种的数据结构,最近花了一点时间将这个部分的源码看了一部分,不知道后面还有没有时间继续查看所以就写一篇文档作为笔记吧。

uthash 使用

uthash 这个开源库使用起来很方便,只有一个头文件(uthash .h),在源代码中只要包含这个头文件就可以进行使用了这个里面的接口
针对使用在网络上能够搜索到的示例代码比较多。这里就是记录一些不一样的地方。
(1)用户结构体

struct my_struct {  
    char name[10];             /* key (string is WITHIN the structure) */  
    int id;  
    UT_hash_handle hh;         /* makes this structure hashable */  
}; 

用户定义的结构体中需要包含这个UT_hash_handle,这个元素,这个元素将会在库的内部使用
(2)head
库提供的函数都会有一个head节点,这个实际上也是一个指针,这个指针相当于链表的头或者数组结构体,在这个head添加之后的节点,搜索的时候就只会搜索head下面的节点

源码结构体分析

首先是这个结构体

typedef struct UT_hash_handle {
   struct UT_hash_table *tbl;
   void *prev;                       /* prev element in app order      */
   void *next;                       /* next element in app order      */
   struct UT_hash_handle *hh_prev;   /* previous hh in bucket order    */
   struct UT_hash_handle *hh_next;   /* next hh in bucket order        */
   void *key;                        /* ptr to enclosing struct's key  */
   unsigned keylen;                  /* enclosing struct's key len     */
   unsigned hashv;                   /* result of hash-fcn(key)        */
} UT_hash_handle;

tbl----存放在数组成员
prev—用户添加的上一个成员
next–该节点之后添加的成员
hh_prev—计算出key的hash冲突的上一个节点
hh_next–hash冲突的下一个节点
key----关键词的内容
keylen—关键词的长度
hashv—关键词的hash结果

typedef struct UT_hash_table {
   UT_hash_bucket *buckets;
   unsigned num_buckets, log2_num_buckets;
   unsigned num_items;
   struct UT_hash_handle *tail; 
   ptrdiff_t hho; 
   unsigned ideal_chain_maxlen;
    unsigned nonideal_items;
   unsigned ineff_expands, noexpand;
   uint32_t signature; /* used only to find hash tables in external analysis */
#ifdef HASH_BLOOM
   uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
   uint8_t *bloom_bv;
   char bloom_nbits;
#endif
} UT_hash_table;

buckets—数组的地址,存放这个head下面的成员
num_buckets—数组的大小
log2_num_buckets—数组的大小的log
num_items—暂时不清楚
tail----添加的最后一个元素
hho----节点的hh和节点的偏差
UT_hash_handle结构在用户结构中的偏移位置,通过UT_hash_handle对象减去hho定位到用户结构对象
ideal_chain_maxlen—暂时不涉及
nonideal_items—暂时不涉及
.ineff_expands—暂时不涉及
noexpand—暂时不涉及
signature--------0xa0111fe1

typedef struct UT_hash_bucket {
   struct UT_hash_handle *hh_head;
   unsigned count;
   unsigned expand_mult;
} UT_hash_bucket;

UT_hash_handle – 存放节点
count----当前这个位置的节点个数
expand_mult—暂时不涉及

额外的基础知识

typeof的用法
把y定义成x指向的数据类型:
typeof(*x) y;

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
阅读Android源代码是一个复杂且庞大的任务,但以下步骤可以帮助你开始: 1. 下载源代码:首先,你需要下载Android源代码。你可以从Android开源项目(AOSP)网站获取最新的Android源代码。根据你的需求,选择并下载相应的代码库。 2. 设置开发环境:在阅读Android源代码之前,确保你已经设置好了开发环境。这包括安装Java开发工具、Android SDK和相关的开发工具链。确保你能够编译和构建源代码。 3. 确定学习目标:由于Android源代码非常庞大,你可能无法一次性阅读完整个代码库。因此,建议先确定你的学习目标。你可以选择阅读特定模块或功能的实现,或者专注于某个特定版本的Android。 4. 阅读文档:Android源代码附带了一些文档,如API文档、开发者指南等。阅读这些文档可以帮助你理解源代码的结构和使用方式。 5. 选择关键模块:Android源代码中有许多关键的模块,如Framework层、系统服务、应用程序等。你可以选择其中一个模块作为起点,逐步深入学习和理解。 6. 阅读源代码和注释:Android源代码中包含了大量的注释,这些注释对于理解代码逻辑和实现细节非常有帮助。同时,你也可以通过阅读源代码来了解Android的设计和实现方式。 7. 调试和运行代码:在阅读源代码的过程中,你可以使用调试工具来跟踪代码执行过程,帮助你理解代码的工作原理。你还可以尝试编译和运行一些简单的代码,验证你对源代码的理解。 8. 参考其他资源:除了Android源代码本身,还有一些优秀的开源项目、书籍和在线教程可以作为辅助学习资源。你可以参考这些资源,加深对Android源代码的理解。 需要注意的是,阅读Android源代码需要一定的编程经验和知识基础,并且需要花费一定的时间和精力。建议在开始之前,先确保你有足够的时间和兴趣去深入学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值