在使用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还提供了其他类型的哈希函数和比较函数,例如对于整数键使用`g_int_hash`和`g_int_equal`,对于指针键使用`g_direct_hash`和`g_direct_equal`。 ##### 插入键值对 插入键值对使用`g_hash_table_insert()`函数...
glib函数手册,作为参考书不错,可以查找到你想用的glib函数。我用的就是这个
虽然 C 语言本身不支持面向对象编程,但 GLib 的 GObject 系统通过提供类、实例、继承、虚函数等特性,弥补了这一不足。GObject 可用于创建复杂的组件和插件架构。 **文件和路径操作** GLib 提供了 GFile 和 Gio 库...
通过`#include "ghash.h"`,开发者可以在自己的代码中使用ghash的功能,无需关心其实现细节。 理解ghash改造独立版源码的关键在于掌握哈希表的基本原理,包括哈希函数的设计、冲突解决策略、动态扩容机制等。此外,...
如果在多线程环境中使用,需要使用`g_hash_table_ref()`和`g_hash_table_unref()`来控制对哈希表的访问,并确保对哈希表的操作是原子的。 8. **自定义哈希和比较函数** GLib允许用户为特定类型的数据提供自定义的...
- 要使用glib中的事件循环、线程管理等功能,需要在编译时链接glib的相关库。 ##### 2.15 object使用 - glib提供了一个简单的对象系统,通过`GObject`类可以实现对象的创建和管理,支持信号和槽机制。 ##### 2.16 ...
Glib是GNU C库的一个重要组成部分,它为C语言提供了一系列的附加数据类型和函数,使其更加符合现代编程的需求,广泛应用于Linux平台上的跨平台开发中。Glib参考手册详细描述了Glib库的功能和使用方法,包括Glib的...
u8glib 库是一个功能强大的图形库,提供了多种图形绘制函数,包括位图绘制、文本绘制、图形绘制等。本手册将详细介绍 u8glib 库的使用方法和参数设置。 1. 初始化函数 begin() begin() 函数用于初始化 u8glib 库,...
Glib是GTK+库的基础,它提供了一系列广泛使用的低级数据类型、函数和宏,用于构建复杂的、跨平台的应用程序。Glib API手册是开发者学习和理解Glib库功能的重要资源,涵盖了各种功能和接口的详细文档。在这个离线API...
DBus-Glib 使用教程 DBus-Glib 是 GNU 标准库,在 Dbus 接口上封装,方便上层服务与应用更好的使用。以下是对 DBus-Glib 的使用框架的详细介绍: 一、背景介绍 Phoenix 平台从安全的角度考虑,广泛的使用 DBUS ...
首先,GLib提供了丰富的数据结构,如链表、队列、树、哈希表等,这些数据结构在C语言中通常需要程序员自己实现,而GLib则简化了这一过程。例如,GList和GSlist提供了动态链表的功能,而GHashTable则支持键值对的快速...
头文件(通常位于`/usr/include/glib-2.0`)包含了GLib库的函数声明,让开发者能在他们的源代码中调用这些函数。库文件(通常为`.a`静态库或`.so`动态库)则是编译链接时所需的,确保程序能够正确调用GLib的功能。...
在压缩包子文件的文件名称列表中,只有"glib-html-2.6.6",这可能是GLib的HTML文档,包含了API参考、教程和其他开发者文档,用于帮助程序员理解和使用GLib的各种函数和特性。 综上所述,这个压缩包很可能包含了GLib...
glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。glib是 Gtk+库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为 许多标准的、常用的C语言结构提供了相应的...
完成编译后,用户可以将生成的库文件(.lib或.dll)和头文件添加到他们的项目中,以便在C代码中使用glib的功能。由于glib是一个底层库,很多图形界面和系统工具都可能依赖它,所以这个编译成果对于Windows上的开发者...
7. 正则表达式:Glib封装了PCRE库,使得在C程序中使用正则表达式变得容易。 8. 格式化和字符串处理:如g_printf、g_strdup等,为字符串操作提供了便利。 9. 线程支持:Glib提供了线程API,使得在多线程环境中编写...
在Linux环境中,GLib使用POSIX线程(pthread)接口进行封装,简化了线程编程。 3. **内存管理**:GLib提供了内存分配和释放的函数,如g_malloc、g_realloc、g_free等,它们可以自动处理内存泄漏和内存碎片问题,比...
同时,它还支持自定义字体,开发者可以通过创建`.font`文件并使用`u8g_font_add()`函数添加到库中。 **6. 内存管理** 为了在资源有限的嵌入式系统上运行,U8glib库采用了高效的内存管理策略。它通常使用屏幕缓冲区...
GLib提供了一些函数(如g_win32_message_loop源代码中的函数)来封装Windows的消息循环,使得GLib的事件驱动模型可以在Windows环境下正常工作。 7. 性能和调试 在Windows上使用GLib时,需要注意性能优化和调试。...