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

问题描述 投票:0回答:1
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函数。所以任何人都可以解释这个未定义的行为。

hashtable contains glib
1个回答
0
投票

散列和相等函数适用于散列表条目中的键,而不是值。您的代码插入了ddata类型的键(以及NULL的值),但随后尝试将它们作为双精度哈希,并将相等的键作为ddatas进行比较。

尝试使用g_direct_hash而不是g_double_hash

© www.soinside.com 2019 - 2024. All rights reserved.