Glib-g_double_hash导致g_hash_table_contains-不确定的行为

时间:2019-03-11 10:24:53

标签: hashtable contains glib

typedef gchar* String;
typedef gboolean Boolean;
struct ddata
{
    int typ;
    union{
        gchar* a;
    };         
};
typedef struct ddata* ddata;

一个示例结构,其实例被插入表中。

Boolean equals_ddata(ddata a, ddata b)
{
    if (a == NULL || b == NULL)
        {
            printf("\nNULL\n");
            return 0;
        }
    if (a->typ == b->typ)
    {
    switch(a->typ)
    {
        case 1:
            {
            if(strcmp(a->a, b->a) == 0)

                return TRUE;
            break;
        }
        default:
            return TRUE;
    }
}
return FALSE;
}
Boolean hm_equals_ddata(gconstpointer a, gconstpointer b) {
    if (((ddata)a) == NULL || ((ddata)b) == NULL) {
        printf("Key for comparison is NULL in hm_equals_ddata");
        return 0;
    }

return equals_ddata((ddata)a, (ddata)b);
}

int main()
{
    ddata obj1 = (ddata)malloc(sizeof(struct ddata));
    ddata obj2 = (ddata)malloc(sizeof(struct ddata));
    ddata obj3 = (ddata)malloc(sizeof(struct ddata));
obj1->typ = 1;
obj1->a = g_strdup("vijay");
obj2->typ = 1;
obj2->a = g_strdup("vijay");
obj3->typ = 2;
obj3->a = g_strdup("kumar");
printf("\n%s, %s, %s\n", obj1->a, obj2->a, obj3->a);
GHashTable* c = g_hash_table_new(g_double_hash, hm_equals_ddata);
printf("%d\n", g_hash_table_insert(c, obj1, NULL));
printf("%d\n", g_hash_table_insert(c, obj2, NULL));
printf("%d\n", g_hash_table_insert(c, obj3, NULL));
printf("%d\n", g_hash_table_contains(c, obj3));
return 0;
}

在这里g_hash_table_contains有时无法正常工作。创建哈希表时附加的equals函数不会被 g_hash_table_contains,这是由于g_double_hash功能所致。所以任何人都可以解释这种不确定的行为。

1 个答案:

答案 0 :(得分:0)

哈希和相等函数适用于哈希表条目中的键,而不适用于值。您的代码插入了sudo service apache2 restart类型的键(以及ddata的值),但是然后尝试将它们散列为double值,并将相等的键比较为NULL s。

尝试使用ddata代替g_direct_hash