glib库hash表GHashTable介绍

C语言哈希表库函数实战:uthash与GLib GHashTable深度解析 哈希表是一种通过哈希函数将键映射到值的高效数据结构,其核心原理是将任意长度的输入通过散列算法变换成固定长度的输出,从而实现接近O(1)时间复杂度的查找、插入和删除操作。在C语言开发中,虽然标准库未直接提供哈希表,但成熟的第三方库如uthash和GLib GHashTable极大地简化了其实现。这些库通过不同的设计哲学解决了内存管理、泛型支持和哈希冲突等关键问题,为开发者提供了从嵌入式系统到桌面应用的灵活选择。在实际工程中,哈希表常用于实现缓存、配置管理、字典查找等场景,能显著提升程序性能。本文以uthash 阅读详情
hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。关于hash表的详细介绍请查阅数据结构的相关书籍,我这里只介绍glib库中hash表的基本用法。

要使用一个hash表首先必须创建它,glib库里有两个函数可以用于创建hash表,分别是g_hash_table_new()和g_hash_table_new_full(),它们的原型如下:

GHashTable  * g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func);

GHashTable
*  g_hash_table_new_full(GHashFunc hash_func,
                                   GEqualFunc key_equal_func,
                                   GDestroyNotify key_destroy_func,
                                   GDestroyNotify value_destroy_func);

其中hash_func是一个函数,它为key创建一个hash值;key_equal_func用于比较两个key是否相等;
key_destroy_func当你从hash表里删除、销毁一个条目时,glib库会自动调用它释放key所占用的内存空间,
这对于key是动态分配内存的hash表来说非常有用;value_destroy_func的作用与key_destroy_func相似,
只是它释放的是value占用的内存空间。

下面以一段代码来演示glib库中hash表的基本用法

/* **************************************************************************
   file: g_hash.c
   desc: 这个文件用于演示glib库中hash表的用法
   compile: gcc -o g_hash g_hash.c `pkg-config --cflags --libs glib-2.0`
 **************************************************************************
*/

#include 
< glib.h >

void  print_key_value(gpointer key, gpointer value, gpointer user_data);
void  display_hash_table(GHashTable  * table);
void  free_key(gpointer data);
void  free_value(gpointer value);

void  print_key_value(gpointer key, gpointer value, gpointer user_data)
{
    printf(
" %s ---> %s/n " , key, value);
}

void  display_hash_table(GHashTable  * table)
{
    g_hash_table_foreach(table, print_key_value, NULL);
}

void  free_key(gpointer data)
{
    printf(
" We free key: %s /n" , data);
    free(data);
}

void  free_value(gpointer data)
{
    printf(
" We free value: %s /n" , data);
    free(data);
}

int  main( int  argc,  char   * argv[])
{
    GHashTable 
* table  =  NULL;

    table 
=  g_hash_table_new(g_str_hash, g_str_equal);

    g_hash_table_insert(table, 
" 1 " ,  " one " );
    g_hash_table_insert(table, 
" 2 " ,  " two " );
    g_hash_table_insert(table, 
" 3 " ,  " three " );
    g_hash_table_insert(table, 
" 4 " ,  " four " );
    g_hash_table_insert(table, 
" 5 " ,  " five " );
    display_hash_table(table);
    printf(
" Size of hash table: %d /n " , g_hash_table_size(table));

    printf(
" Before replace: 3 ---> %s /n " , g_hash_table_lookup(table,  " 3 " ));
    g_hash_table_replace(table, 
" 3 " ,  " third " );
    printf(
" After replace: 3 ---> %s /n" , g_hash_table_lookup(table,  " 3 " ));

    g_hash_table_remove(table, 
" 2 " );
    display_hash_table(table);
    printf(
" Now size of hash table: %d /n" , g_hash_table_size(table));

    g_hash_table_destroy(table);

    table 
=  g_hash_table_new_full(g_str_hash, g_str_equal, free_key, free_value);
    g_hash_table_insert(table, strdup(
" one " ), strdup( " first " ));
    g_hash_table_insert(table, strdup(
" two " ), strdup( " second " ));
    g_hash_table_insert(table, strdup(
" three " ), strdup( " third " ));
    
    printf(
" Remove an item from hash table: /n " );
    g_hash_table_remove(table, 
" two " );

    printf(
" Destroy hash table: /n" );
    g_hash_table_destroy(table);

    
return   0 ;
}

通过代码我们看到glib库为hash表接供了非常简单的接口。下面是代码的输出

[plusboy@localhost c]$ ./g_hash
1 ---> one
2 ---> two
3 ---> three
4 ---> four
5 ---> five
Size of hash table: 5
Before replace: 3 ---> three
After replace: 3 ---> third
1 ---> one
3 ---> third
4 ---> four
5 ---> five
Now size of hash table: 4
Remove an item from hash table:
We free key: two
We free value: second
Destroy hash table:
We free key: three
We free value: third
We free key: one
We free value: first

对代码的说明:

1、首先我们调用了g_hash_table_new()来创建一个hash表,然后用g_hash_table_insert()向hash表里插入条目,插入的条目必须是一个key-value对,要查看hash表里有多少个条目可以用g_hash_table_size()。
2、用g_hash_table_lookup()通过key可以查找到与它相对应的value,g_hash_table_replace()可以替换掉一个key对应的value。
3、用g_hash_table_foreach()可以遍历hash表里的每一个条目,并对它们进行相应的操作。
4、用g_hash_table_remove()把一个条目从hash表里删除。
5、用g_hash_table_destroy()销毁一个hash表。
6、对于用g_hash_table_new_full()创建并提供了key_destroy_func和value_destroy_func的hash表,删除hash表中的条目或者销毁hash表的时候,库自动调用这两个函数释放内存,在销毁hash表的时候,销毁条目的顺序与插入条目的顺序并不总是相同的。代码中我们用strdup()来为hash表的key和value动态分配内存。

对glib库更多参考:
http://developer.gnome.org/doc/API/2.0/glib/index.html
GLib哈希表全面解析:从基础使用到高级技巧 GLib哈希表(GHashTable)是C语言开发中高效灵活的数据结构实现。本文全面解析了其核心功能:从基础操作(创建、插入、查找、删除)到高级用法(自定义键类型、内存管理策略)。深入探讨了其内部机制,包括哈希冲突处理、动态扩容和惰性删除等优化技术。文章提供了性能优化技巧、线程安全建议和特殊场景解决方案,并包含完整示例代码展示如何管理自定义数据结构。通过理解GLib哈希表的设计原理和最佳实践,开发者能够在项目中充分利用这一强大工具,实现高效的数据存储和检索。 阅读详情

相关推荐

Mono里运行C#脚本6—mono加载EXE文件和DLL文件保存的HASH表

遍历:可以使用 g_hash_table_iter_init() 和 g_hash_table_iter_next() 函数来遍历哈希表中的所有键值对。创建:使用 g_hash_table_new() 函数创建一个新的哈希表,需要提供键和值的哈希函数以及键和值的比较函数。在这里创建一个HASH表对象,也是分配内存,并且使用g_str_hash和g_str_equal作为HASH计算的函数。通过上面的函数定义,就可以实现一个保存EXE文件和相关DLL文件的存储HASH表,以便快速地访问所有相关的文件数据。

大坡3D软件开发 604

C函数学习(2):GLib HashTable函数

哈希表是一种基于key-value进行访问的数据结构,可以加快查找的速度,因此在一些需要快速查找是否有重复元素的场景中,常常使用哈希表来实现。

Stoneshen的博客 2772

从法律文档到知识图谱

这里我们定义了两个 Pydantic 模型:Location 用于捕捉结构化的地址信息,包含可选的国家、州和地址字段;Party 用于表示合同参与方,包含必填的名称和可选的位置详情。字段描述通过告知 LLM 每个字段具体需要查找哪些信息,来辅助提取过程。"""包含结构化地址组件的位置信息。"""country: Optional[str] = Field(None, description="国家")

Anspire的博客 3030

glib的GHashTable实践

glib的GHashTable实践

1355

同花顺PC端逆向解析:Hook注入与加密破解实战指南

在Windows客户端数据采集场景中,当常规HTTP爬虫失效时,内存级逆向分析成为获取实时行情数据的关键路径。其核心涉及进程注入、运行时解密、反调试绕过等底层技术,本质是理解PE加载机制、函数调用约定与内存保护策略的协同过程。同花顺作为典型加固客户端,采用ASPack加壳+自研解密+多线程校验三重防护,迫使开发者转向APC注入、动态密钥提取与XXTEA算法复刻等高阶手段。本文聚焦于DLL注入选型依据、解密函数定位方法及二进制Blob结构化解析,最终实现从内存读取到Pandas DataFrame的端到端数据

weixin_32234493的博客 1194

C#调用Bartender打印标签,除了打印还能一键导出图片和PDF(附完整代码)

本文详细介绍了如何使用C#集成Bartender实现标签的多格式输出,包括打印、图片和PDF导出。通过完整的代码示例和实战技巧,帮助开发者解决分辨率适配、纸张尺寸控制等核心问题,提升工业自动化和物流管理中的标签处理效率。

weixin_31236101的博客 369

GLIB中GHashTable——哈希表的介绍

最近在看的东西中有关于中GHashTable的,一开始的时候哦很懵懂,GHashTable是什么东东,不知道,不清楚,不明白。。 谷歌一下GHashTable: hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。 明白了吧,原来hash表就是一种数据结构。。

程序狗的成长之路 8416

开源 AHB不对称半桥反激电路设计(六)死区时间,谐振腔电流,谐振电感函数表达式

电流跌落可以使副边电流峰值和有效值降低,减小损耗,但如果开关管 S2 导通期间,谐振电流谐等于励磁电流,即副边电流A 点降至 0,会在原边变压器内形成环流,产生损耗,同时也不利于副边同步整流管驱动的正常工作,为了保证开关管 S2 导通期。在开关管 S1 和开关管 S2 均关断的死区时间内,谐振电流给原边开关管结电容和副边整流管结电容充放电,因此会引起开关 S1 关断瞬间电流跌落与开关 S2 关断瞬间电流震荡现象,受寄生参数影响原边谐振电流波形和副边电流波形如图。降到最低,变压器以最高效率向副边传递能量。

【Simon】的博客 1228

周记3(除留余数)

周记

qq_39105888的博客 167

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9199

SAP中错记虚拟利润中心的调整,冲销处理实例

我非CO专业顾问。工作中遇到的问题,也会找资料,分析,测试。有时这个过程会拿到结果,解决问题。遂将过程记录下来备查。读者请谨慎参考!EC-PCA: 利润中心记账流程_9ke0-优快云博客。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 1795

Linux glib库hash表GHashTable介绍

GHashTable1 简单使用2 原理分析3 思考总结 1 简单使用 hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。 要使用一个hash表首先必须创建它,glib库里有两个函数可以用于创建hash表,分别是g_hash_table_new()和g_hash_table_new_full(),它们的原型如下: GHashTable *g_hash_table_new(G

不如敲代码的博客 3955

ABAP Platform 2025 到来之后,我们该怎样重新理解 SAP S/4HANA 2025 的开发边界

2025年10月,SAP正式发布S/4HANA Cloud Private Edition 2025及S/4HANA 2025,其技术底座ABAP Platform 2025全面支持SAP HANA数据库。新版平台强调Clean Core理念升级为四级成熟度模型,推动ABAP Cloud成为扩展开发首选方案。AI能力正式融入ABAP开发全流程,包括代码生成、迁移辅助等场景。RAP框架显著增强,支持跨业务对象协作、树形视图等复杂业务场景。ADT开发工具持续进化,新增内存分析、单元测试等专业功能,形成完整开发工

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 304

glib库hash表GHashTable

hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。关于hash表的详细介绍请查阅数据结构的相关书籍,我这里只介绍glib库中hash表的基本用法。 要使用一个hash表首先必须创建它,glib库里有两个函数可以用于创建hash表,分别是g_hash_table_n

cws1214的专栏 1073

[QMT量化交易小白入门]-九、如何用Python记录每一笔交易和调试,报错信息?

定义一个函数来获取日志记录器。: 返回全局的日志记录器,以便在其他地方调用。

木头大左的博客 2143

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

glib库hash表GHashTable介绍 .

hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。关于hash表的详细介绍请查阅数据结构的相关书籍,我这里只介绍glib库中hash表的基本用法。 要使用一个hash表首先必须创建它,glib库里有两个函数可以用于创建hash表,分别是g_hash_table

pp0xx0ww0的专栏 1220

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux-c glib库hash表GHashTable介绍

百度云glib 链接:https://pan.baidu.com/s/1W9qdlMKWRKIFykenTVuWNQ 密码:ol6y hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。关于hash表的详细介绍请查阅数据结构的相关书籍,我这里只介绍glib库...

weixin_30487317的博客 235

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

glib:GHashTable实例

glib:GHashTable实例

1197

GLib数据结构详解:GList、GHashTable与GArray使用指南

GLib是GNOME项目的核心库,提供了丰富的数据结构实现,其中GList、GHashTable和GArray是最常用的三种基础容器。本文将详细介绍这三种数据结构的特性、适用场景和使用方法,帮助开发者高效利用GLib提升C语言开发效率。 ## 一、GLib数据结构概述 GLib作为GNOME生态的基础库,为C语言提供了现代化的数据结构支持。这些容器不仅具有跨平台特性,还经过了严格的性能优化,广

gitblog_00797的博客 796

4_09_GLib库入门与实践_哈希表

简介 Hash是一种常见的数据结构,GLib提供了操作Hash表的多种操作函数。 数据结构 Hash表有两个重要的数据结构,GHashTable和GHashTableIter,这两者都是不透明的数据结构,可以整体使用它,但无法单独使用其中的一个结构体成员。GHashTable是Hash表本身相关,GHashTableIter与迭代器相关,用来遍历或操作Hash表中的数据。 Hash表: typedef struct _GHashTable GHashTable; 迭代器: typedef struct _

field1003的博客 1444
上一篇: glib库队列GQueue介绍
下一篇: RPM与pkg两种软件安装包的制做方法
plusboy
博客等级 码龄20年 48粉丝 26原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值