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

在使用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并不一样,这个元素不是要找的。

你可能感兴趣的:(hash表)