`
mypyg
  • 浏览: 551836 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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并不一样,这个元素不是要找的。
分享到:
评论

相关推荐

    LinuxC的glib库GHashTable用法.pdf

    GLib还提供了其他类型的哈希函数和比较函数,例如对于整数键使用`g_int_hash`和`g_int_equal`,对于指针键使用`g_direct_hash`和`g_direct_equal`。 ##### 插入键值对 插入键值对使用`g_hash_table_insert()`函数...

    GLib 中文参考手册

    虽然 C 语言本身不支持面向对象编程,但 GLib 的 GObject 系统通过提供类、实例、继承、虚函数等特性,弥补了这一不足。GObject 可用于创建复杂的组件和插件架构。 **文件和路径操作** GLib 提供了 GFile 和 Gio 库...

    ghash改造独立版源码

    通过`#include "ghash.h"`,开发者可以在自己的代码中使用ghash的功能,无需关心其实现细节。 理解ghash改造独立版源码的关键在于掌握哈希表的基本原理,包括哈希函数的设计、冲突解决策略、动态扩容机制等。此外,...

    glib hash table

    如果在多线程环境中使用,需要使用`g_hash_table_ref()`和`g_hash_table_unref()`来控制对哈希表的访问,并确保对哈希表的操作是原子的。 8. **自定义哈希和比较函数** GLib允许用户为特定类型的数据提供自定义的...

    glib函数手册 函数大全

    glib函数手册,作为参考书不错,可以查找到你想用的glib函数。我用的就是这个

    glib常用库函数总结

    - 要使用glib中的事件循环、线程管理等功能,需要在编译时链接glib的相关库。 ##### 2.15 object使用 - glib提供了一个简单的对象系统,通过`GObject`类可以实现对象的创建和管理,支持信号和槽机制。 ##### 2.16 ...

    Glib参考手册

    Glib是GNU C库的一个重要组成部分,它为C语言提供了一系列的附加数据类型和函数,使其更加符合现代编程的需求,广泛应用于Linux平台上的跨平台开发中。Glib参考手册详细描述了Glib库的功能和使用方法,包括Glib的...

    u8glib 库 用户参考手册

    u8glib 库是一个功能强大的图形库,提供了多种图形绘制函数,包括位图绘制、文本绘制、图形绘制等。本手册将详细介绍 u8glib 库的使用方法和参数设置。 1. 初始化函数 begin() begin() 函数用于初始化 u8glib 库,...

    如何使用Glib工具集管理C数据

    GLib中的散列表支持多种散列函数和比较函数。 4. **数组 (`GArray`)**:GLib中的数组是一个动态数组,可以在运行时调整其大小,非常适合需要频繁添加或删除元素的情况。 5. **树 (`GMTree`)**:树结构是计算机科学中...

    dbus-glib使用教程

    DBus-Glib 使用教程 DBus-Glib 是 GNU 标准库,在 Dbus 接口上封装,方便上层服务与应用更好的使用。以下是对 DBus-Glib 的使用框架的详细介绍: 一、背景介绍 Phoenix 平台从安全的角度考虑,广泛的使用 DBUS ...

    Glib离线API手册

    Glib是GTK+库的基础,它提供了一系列广泛使用的低级数据类型、函数和宏,用于构建复杂的、跨平台的应用程序。Glib API手册是开发者学习和理解Glib库功能的重要资源,涵盖了各种功能和接口的详细文档。在这个离线API...

    GLib 2.10.3 CHM手册

    glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。glib是 Gtk+库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为 许多标准的、常用的C语言结构提供了相应的...

    glib 2.20 windows 版本

    本文将详细介绍如何在Windows上使用glib 2.20版本,特别是使用Visual Studio 2008进行编译和链接。 **一、glib 2.20.4简介** glib 2.20.4是glib的一个稳定版本,它包含了多项改进和修复。这个版本提供了对Windows...

    glib-win32 windows下编译的glib,可直接包含头文件使用

    首先,GLib提供了丰富的数据结构,如链表、队列、树、哈希表等,这些数据结构在C语言中通常需要程序员自己实现,而GLib则简化了这一过程。例如,GList和GSlist提供了动态链表的功能,而GHashTable则支持键值对的快速...

    glib2-devel

    头文件(通常位于`/usr/include/glib-2.0`)包含了GLib库的函数声明,让开发者能在他们的源代码中调用这些函数。库文件(通常为`.a`静态库或`.so`动态库)则是编译链接时所需的,确保程序能够正确调用GLib的功能。...

    linux(centos)使用glib日志库

    `glogDemo`这个文件可能是示例代码或编译好的可执行文件,用于演示如何在实际应用中使用Glib的日志功能。通过阅读和运行这个示例,你可以更深入地了解Glib日志库的用法。 总的来说,Glib日志库为Linux(CentOS)上的C...

    glib-html-2.6.6.tar.gz_glib_glib-2.6.6.tar.b_linux gl

    在压缩包子文件的文件名称列表中,只有"glib-html-2.6.6",这可能是GLib的HTML文档,包含了API参考、教程和其他开发者文档,用于帮助程序员理解和使用GLib的各种函数和特性。 综上所述,这个压缩包很可能包含了GLib...

    浅谈Windows系统下C语言编程中Glib库的使用

    在这个C的变成世界里,有许多实用的库,其中最有名的且最通用(跨多个平台的实现包括...如果在程序中要使用到glib库中的函数,则应该包含glib.h头文件(在gtk.h和gnome.h头文件中已经包含了glib.h了。 但是,因为这是

    vs2013编译glib2.48.2

    完成编译后,用户可以将生成的库文件(.lib或.dll)和头文件添加到他们的项目中,以便在C代码中使用glib的功能。由于glib是一个底层库,很多图形界面和系统工具都可能依赖它,所以这个编译成果对于Windows上的开发者...

    glib dll files.

    7. 正则表达式:Glib封装了PCRE库,使得在C程序中使用正则表达式变得容易。 8. 格式化和字符串处理:如g_printf、g_strdup等,为字符串操作提供了便利。 9. 线程支持:Glib提供了线程API,使得在多线程环境中编写...

Global site tag (gtag.js) - Google Analytics