【问题标题】:Glib - g_double_hash causes g_hash_table_contains - uncertain behaviourGlib - g_double_hash 导致 g_hash_table_contains - 不确定的行为
【发布时间】:2019-03-11 10:24:52
【问题描述】:
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】:

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

    尝试使用g_direct_hash 而不是g_double_hash

    【讨论】:

    • g_direct_hash - 我已经尝试过使用它。我遇到了同样的问题。
    • 是什么让你觉得equals函数没有被调用?在gdb 下运行它并在equals_ddata 下附加一个断点,断点在g_hash_table_contains() 下命中。
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多