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