关于uthash 的初步源码阅读

2023-11-20

背景:

在偶然的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;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于uthash 的初步源码阅读 的相关文章

  • AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

    写在前面 先推荐一下另一篇关于使用AutoDL的教程 AutoDL使用教程 1 创建实例 2 配置环境 上传数据 3 PyCharm2021 3专业版下载安装与远程连接完整步骤 注意 在AutoDL的终端键入命令运行时 通常是一定要先cd进
  • 华为OD机试 - 密室逃生游戏(Java)

    题目描述 小强正在参加 密室逃生 游戏 当前关卡要求找到符合给定 密码K 升序的不重复小写字母组成 的箱子 并给出箱子编号 箱子编号为 1 N 每个箱子中都有一个 字符串s 字符串由大写字母 小写字母 数字 标点符号 空格组成 需要在这些字
  • 随手学习笔记

    1 正点原子zynq视频教程 真人版 P128 P132讲解ADDA 第30 1讲高速ADDA实验 ADC芯片简介 哔哩哔哩 bilibili 2 正点原子zynq视频教程 真人版 关于zynq FPGA讲解非常详细 可逐个详细学习 第1讲
  • 使用QZXing生成并解析二维码

    QZxing 是对 zxing 的一个封装 用于在 Qt 程序中加入条形码和二维码识别的功能 这里就讲讲如何编译和使用这个库 前几年 QZXing 的代码是放到 sourceforge net 上的 现在迁移到了 github com 所以

随机推荐

  • sql手工注入

    information schema 系统数据库 包含所有数据库相关信息 information schema schemata中schema name列 字段为所有数据库名称 information schema tables中table
  • 中山大学App校园地图功能分析

    中山大学App校园地图简单功能分析介绍 用户入口 进入中山大学App首页 即可看到校园地图 点击后进入校园地图主界面 校区选取 进入地图主界面后 即可呈现出校园地图 顶上正中间是选取校区的功能按钮 单击后出现全部4个校区可供选择 路线导航
  • 如何在手机上打开xmind文件_如何高效率整理电脑上的文件 ?

    个人电脑 01 没有时间整理 也不想整理 怎么办 1 1 只整理电脑桌面 电脑桌面放着各种文件 已经成为多数人的习惯 一打开电脑 就可以从电脑桌面上看见自己有哪些文件等着处理 当天处理的文件存放在桌面 第二天要用的时候 直接在桌面打开就可以
  • python遍历文件夹中的图片

    import cv2 import os mainFolder Images RectSmall myFolders os listdir mainFolder print myFolders for folder in myFolders
  • jre jdk更改目录后Java无法运行问题解决方案

    问题 在将Java文件 包含jdk jre 由C盘直接剪贴到D盘后 所有Java程序无法运行 且其Java图标不再显示 解决方案 首先更改环境变量 当我们单纯地将Java文件更改位置后 我们计算机的环境变量仍未改变 依旧是当时安装Java时
  • Verilog中if- else if语句和case语句用法:

    一 if语句 1 两种情况 if 条件语句 begin end else begin end 2 多种情况 if 条件语句 begin end else if 条件语句 begin end else if 条件语句 begin end el
  • 编程大师-Netty

    45 张图深度解析 Netty 架构与原理 里奥ii的博客 CSDN博客 netty全过程图解 最详细清晰版 netty流程 PANDA的博客 CSDN博客
  • Kafka学习(三)简单实例(可以简单做测试)

    java客户端连接kafka简单测试 本案例kafka版本是kafka 2 11 0 9 0 1 用java来实现kafka生产者 消费者的示例 在测试的过程中遇到的特别的问题以及解决办法 其他小问题就不一一列举了 1 使用kafka cl
  • libero-soc许可证申请和环境配置

    环境 64位机 在哪台电脑上安装libero soc 就用哪台电脑申请许可证 1 注册 https www microsemi co 在官网注册 之后申请的许可证会发到注册时填写的邮箱 2 申请许可证 https www microsemi
  • 操作系统 段页式存储管理

    一 引入 分页系统是以页面作为内存分配的基本单位 能有效地提高内存利用率 但信息共享等不方便 分段系统是以段作为内存分配的基本单位 它能够更好地满足用户多方面的需要 信息共享 动态链接等 但采用分区方式管理物理内存 仍然存在碎片问题 段页式
  • mysql varchar类型条件查询不加引号

    一张160w数据量的表 select from order promotion where order no 15441913435665186 select from order promotion where order no 1544
  • Gradle –多个启动脚本示例

    很少有build gradle示例向您展示如何创建多个启动脚本或可执行Java应用程序 1 单启动脚本 1 1在Gradle中 您可以使用应用程序插件来创建可执行的Java应用程序 build gradle apply plugin app
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • 全国各省市座机电话区号整理

    excel数据整理下载地址 https download csdn net download MtiredM 87620876 json格式数据整理 const areaCodes 热门城市 010 北京市 024 沈阳市 0371 郑州市
  • Qt对话框

    Qt的对话框分为两种 模态对话框和非模态对话框 模态对话框 模态对话框 不可以对其其他窗口进行操作 比如像下面这种 出现后无法再操作其他窗口 比如像下面这种 创建后就无法在操作写代码的窗口 创建对话框要将 include
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • C语言经典100例题(18)--题目:求s=a+aa+aaa+aaaa+aa...a的值

    目录 题目 问题分析 代码 测试结果 题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 问题分析 加数之间的规律 a a 0 10
  • Python实现归并排序

    Python实现归并排序 一 归并排序简介 归并排序 Merge Sort 是建立在归并操作上的一种效率很高的排序算法 比较占用内存 该算法是分治法 Divide and Conquer 的一个典型应用 归并排序将两个或两个以上 一般是两个
  • 华为OD机试 Python 【响应报文时间】

    题目 假设你正在接收网络报文 并且需要在一定时间内对它们作出响应 每次当你收到一个报文时 它会有一个 最大响应时间 来告诉你最晚需要在什么时候回应 但是 如果在等待回应期间又收到了新的报文 你可能需要更新你的响应时间 最大响应时间 是这样计
  • 关于uthash 的初步源码阅读

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