• glib hash库GHashTable的使用实例


    前言

      hash表是一种key-value访问的数据结构,hash表存储的数据能够很快捷和方便的去查询。在很多工程项目都需要使用到hash表来存储数据。对于hash表的详细说明这里就不进行阐述了,不了解的可以去查找资料进行了解。今天这里是使用glib的hash库来进行数据的存储和读写,通过实例来进行简单的应用。

    gib GHashTable API介绍

      这里会简单的说明一下例子中用到的api接口。

      GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func);

      功能:生成hash表。

      参数:hash_func 创建hash值得函数,它为key创建一个hash值。这里可以用glib函数库里自带的g_str_hash。也可以用自己的创建的函数来建立规则

         key_equal_func 用来比较key的函数,当入库时会进行key的比较。同样这里也可以 用glib自带的g_int_equal。也可以用自己的创建的函数来建立比较规则。

      返回值:返回一个句柄。

      

      GHashTable* g_hash_table_new_full(GHashFunc hash_func,GEqualFunc key_equal_func, GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func);

      功能:同样是用来创建hash表的。比g_hash_table_new多了两个数据处理函数,相当于g_hash_table_new进阶版。因为在实际项目中很多都是需要进行内存管理。所以我们的例子用到的是这个函数。会用这个就会用上面那个了

      参数:hash_func 创建hash值得函数,它为key创建一个hash值。这里可以用glib函数库里自带的g_str_hash。也可以用自己的创建的函数来建立规则

         key_equal_func 用来比较key的函数,这个函数在哈希表查找键值时使用。同样这里也可以 用glib自带的g_int_equal。也可以用自己的创建的函数来建立比较规则。

         key_destroy_func key数据处理函数,用来释放内存 。

         value_destroy_func value数据处理函数,用来释放内存

      返回值:返回一个句柄

      

      void g_hash_table_insert(GHashTable *hash_table, gpointer key, gpointer value);

      功能:向hash表中插入数据。

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

         key:hash表键

         value:hash表的值

      

      void g_hash_table_foreach(GHashTable *hash_table, GHFunc func, gpointer user_data);

      功能:hash表遍历函数,用来遍历hash表

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

         func 回调函数,没遍历到一个key-value就回调此函数,对数据进行处理。

         user_data:给回调函数传入的参数。

      

      void g_hash_table_destroy(GHashTable *hash_table);

      功能:释放hash表

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

    在本文的实例中会用到上面的那些api接口。当然glib的hash函数接口肯定是不止上面那些的,这里只是一些简单的使用,下面是一些没用到的函数接口介绍,以后有时间在慢慢补到实例中去,其实不写看介绍一般也会用了。

      guint g_hash_table_size(GHashTable *hash_table);

      功能:返回表中键值对的个数

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

      gpointer g_hash_table_lookup(GHashTable *hash_table, gconstpointer key);

      功能:通过key去查找相对应的值。这个函数不会去判断这个key值是否存在的,在使用前要确保key不为NULL。

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

          key:要查找的key。

      gboolean g_hash_table_remove(GHashTable *hash_table, gconstpointer key);

      功能:删除指定key的键值对。注意这个函数不会释放键值对的内存。所以如果使用 g_hash_table_new_full函数就比较方便了,会在删除的时候去回调函数释放。如果使用的是g_hash_table_new。就需要我们自己去释放内存了。这里需要注意

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

          key:要删除的指定key

      gpointer g_hash_table_find(GHashTable *hash_table, GHRFunc predicate, gpointer user_data);

      功能:查找特定的键值对。会遍历hash表回调predicate函数判断自己定义规则的键值对。ture表示找到。

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

          predicate 回调函数,用来定义特定键值对的规则。

         user_data 传入回调函数的参数

      void g_hash_table_replace(GHashTable *hash_table, gpointer key, gpointer value);

      功能:向hash表中插入键值对。与g_hash_table_insert不同的是,如果插入的key已经存在这个会替换原来的key与value。g_hash_table_insert只会替换值

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

          key:插入的键

            value:插入的值

      GList* g_hash_table_get_keys(GHashTable *hash_table);

      功能:获取hash表中所有的键

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

      GList* g_hash_table_get_values(GHashTable *hash_table);

      功能:获取hash表中所有的值

      参数:hash_table:hash表的句柄,1 ,2函数的返回值

    还有一些函数这里就不做介绍了,具体可以到这里查看https://developer.gnome.org/glib/unstable/glib-Hash-Tables.html#

    代码实例

    编译 gcc main.c `pkg-config --libs --cflags glib-2.0`   后面有时间会增加api的实例数量。  

    #include <stdio.h>
    #include <glib.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct _Node {
        char key[32];
        char value[32];
    }Node;
    
    static void displayhash(gpointer key, gpointer value, gpointer user_data) {
        printf("user_data:%s
    ",user_data);
        printf("key:%s value:%s
    ",key,value);
    }
    
    static void destroy_key(gpointer hash_data) {
        printf("destroy key:%s
    ",hash_data);
        //因为我这里的键是数组形式不是指针所以不用释放内存。我就直接清空吧
    /*    free(hash_data);
        hash_data = NULL;*/
        memset(hash_data,0,sizeof(hash_data));
    }
    
    static void destroy_value(gpointer hash_data) {
        printf("destroy value:%s
    ",hash_data);
        //因为我这里的值是数组形式不是指针所以不用释放内存。我就直接清空吧
    /*    free(hash_data);
        hash_data = NULL;*/
        memset(hash_data,0,sizeof(hash_data));
    }
    
    /*用来创建每个节点。每个键值对都需要有自己的内存*/
    Node *create_node(char *key,char * value) {
        Node *node = NULL;
        node = malloc(sizeof(Node));
        if (node == NULL) {
            return NULL;
        }
    
        memset(node,0,sizeof(Node));
        strcpy(node->key,key);
        strcpy(node->value,value);
    
        return node;
    }
    
    int main()
    {
        char buff[32] = {0};
        static GHashTable *g_hash = NULL;
        
        g_hash = g_hash_table_new_full(g_str_hash, g_int_equal, destroy_key, destroy_value);
        
        Node *node = create_node("name","xcy");
        if(node != NULL)
            g_hash_table_insert(g_hash, &node->key, &node->value);
        Node *node1 = create_node("age","18");
        if(node1 != NULL)
            g_hash_table_insert(g_hash, &node1->key, &node1->value);
        Node *node2 = create_node("sex","man");
        if(node2 != NULL)
            g_hash_table_insert(g_hash, &node2->key, &node2->value);
        Node *node3 = create_node("id","00001");
        if(node3 != NULL)
            g_hash_table_insert(g_hash, &node3->key, &node3->value);
    
    
        memcpy(buff,"this is parm",12);
        if(NULL != g_hash) {
            g_hash_table_foreach(g_hash, displayhash, buff);
        }
        
    
        printf("------------------free hashtable------------------------
    ");
    
        g_hash_table_destroy(g_hash);
    }

    实例结果

      

      

        

  • 相关阅读:
    Android Activity 四种启动模式
    Android Activity的生命周期
    Android SQLite (五 ) 全面详解(三)
    Android SQLite (四 ) 全面详解(二)
    工作流设计 zt
    法律网站分类 ­zt
    刑事案件的构成要素 zt
    犯罪构成三层次记忆口诀 zt
    E asy Boo t 6.51 启动易 制作启动光盘的软件(附注册码)
    父线程开启子进程且共享内存
  • 原文地址:https://www.cnblogs.com/piaoyang/p/9306470.html
Copyright © 2020-2023  润新知