glib中hash表函数的使用(ghash)

本文深入探讨了GHASH表的工作原理,特别是hash值冲突时如何通过key_equal_func进行精确匹配,确保即使不同key拥有相同hash值也能正确区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用ghash看其文档时对insert的介绍是如果key值相同的value再插入时会被替换,对于判断key值相等的标准不太清楚,是hash值相等的话发生hash碰撞时不就麻烦了,于是结合文档以及其源代码,自己写代码做了下验证,结果如下文描述。





1.创建新hash表:

GHashTable* g_hash_table_new (GHashFunc hash_func,
GEqualFunc key_equal_func);



第一个函数用来把key转换成hash值;第二个函数用来精确确认key。



hash_func说明:

"str1", "str2", "str3", "str11" 这是4个key串

自定义一个hash_func,将串的第4个字符转换成数字作为hash值,那么对应得到4个hash值分别是:

1, 2, 3, 1



key_equal_func的调用时机(以上面的hash_func来说明):

1.向表中添加新元素时可能会调用:(当不同的key产生了同样的hash值,发生了碰撞时会调用)

(1)插入key值"str1"以及其对应的value,此时hash值1在表中是唯一的,不会调用

(2) 插入"str2", "str3",hash值2,3仍然时唯一的,不会调用

(3) 插入"str11",其hash值为1,但是位置1已经有内容了,此时就会调用key_equal_func,来判断这两个key值是不是真的一样。如果 key_equal_func()返回true,那么认为这两个key值是一样的,原来的value就会被替换掉。如果返回false,那么就会作为一个新元素插入,虽然他们两个配对key的hash值是一样的。如果大量这样的情况发生,就是hash_func函数选择的不好了。(glib中自带了一些 hash函数,这些可以看文档)



2.查找表中的元素时肯定会调用:

比如要查找"str11"对应的value,会首先计算其hash值为1,然后在hash表中查找对应此hash值的元素,可能有多个,为了确认是不是自己要找的,所以会调用key_equal_func(),如果返回true,表示确实是这个key对应的元素,如果返回false,那么说明虽然hash 值一样,但是实际key并不一样,这个元素不是要找的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值