在使用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并不一样,这个元素不是要找的。
分享到:
相关推荐
glib函数手册,作为参考书不错,可以查找到你想用的glib函数。我用的就是这个
GLib中文参考手册,学习GLib库的好帮手,提高自己的C语言开发水平。
LinuxC的glib库GHashTable用法·整理 hash数据结构的基本用法,很全、很详细。
glib常用库操作说明,包括基本类型,断言,宏调试,单/双向链表,存储管理,计时器,字符串处理,错误处理,事件,线程,object对象使用 等等
做工程需要 hash table,而 VC6 没有提供,GLIB中的hash table 简单易用,于是拆出来用。
在windwos下编译出来的glib库,可以直接包含头文件进行使用,在整个编译过程中比较的繁杂,依赖项太多,差点吐血了,还好最终还是编译出来了,亲测可用
使用 GLib 工具集管理 C 数据:组织数据、单向链表、双向链表、散列表、数组、树、队列
glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。glib是 Gtk+库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为 许多标准的、常用的C语言结构提供了相应的...
在这个C的变成世界里,有许多实用的库,其中最有名的且最通用(跨多个平台的实现包括...如果在程序中要使用到glib库中的函数,则应该包含glib.h头文件(在gtk.h和gnome.h头文件中已经包含了glib.h了。 但是,因为这是
对dbus-glib的使用框架进行了说明,分为服务端和客户端,分别对方法和信号进行了说明
跨平台开发时基本都会用到Glib。文档是Glib的参考手册。英文,pdf
GLib Reference Manual for GLib 2.16.1 GLib 参考手册
经典的glib hashtable,改写拆解成可单独使用的工具。
GLib是一种底层库,创建GDK和GTK应用程序时该库提供许多有用的定义和函数。 包括基本类型及限制的定义、标准宏、类型转化、...最后GLib具有很好的移植性,所以使用GLib作为底层应用支持,那么也保证了应用的可移植性。
在安装qemu的时候,在你安装了zlib之后,系统可能会提示你缺少glib-2.0,那么把这个软件包下载了吧!
g l i b库是L i n u x平台下最常用的 C语言函数库,它具有很好的可移植性和实用性。... h中的头文件很容易理解,很多函数从字面上都能猜出它的用处 和用法。如果有兴趣,g l i b的源代码也是非常好的学习材料。
glib的Windows版本开发库,包含头文件及lib,运行时的动态库
glib-2.63.3源码包,需要的可以下载编译,可以使用。...glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。glib是Gtk +库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等
ARM学习8对于画线函数Glib_Line算法的研究.pdf
这个是glib2-devel,它和glib.2..不一样。 我是在编译heartbeat时,遇到缺少glib2-devel包的时候,下载的。 包含64位系统的和32位系统的