g_hash_table:int64作为键

时间:2013-03-26 06:59:46

标签: c glib

我正在使用glib g_hash_table创建一个哈希表,其中int64为键,指针为值。

我尝试了这段代码,但失败了:

GHashTable* hash = g_hash_table_new(g_int64_hash, g_int64_equal);
uint64_t mer_v = 0;
exist_m = g_hash_table_lookup(hash, mer_v);

报告错误:

(gdb) bt
#0  IA__g_int64_hash (v=0x1d89e81700000) at /build/buildd/glib2.0-2.24.1/glib/gutils.c:3294
#1  0x00007ff2de966ded in g_hash_table_lookup_node (hash_table=0x13a4050, key=0x1d89e81700000) at /build/buildd/glib2.0-2.24.1/glib/ghash.c:309
#2  IA__g_hash_table_lookup (hash_table=0x13a4050, key=0x1d89e81700000) at /build/buildd/glib2.0-2.24.1/glib/ghash.c:898

我经常使用glib数据结构,但从未尝试过使用密钥int64的hash_table。无法从Google找到任何帮助。本教程也没有任何匹配:http://www.ibm.com/developerworks/linux/tutorials/l-glib/section5.html

请帮忙。感谢。

1 个答案:

答案 0 :(得分:4)

要使用g_int64_hashg_int64_equal,您需要在哈希表中存储64位密钥的地址。因此,正确的查找将是:

exist_m = g_hash_table_lookup(hash, &mer_v);

要使用此hasher /比较器,需要动态分配所有密钥,并将其地址传递给g_hash_table_insertg_hash_table_lookup

uint64_t *mer_p = malloc(sizeof(uint64_t));
*mer_p = mer_v;
g_hash_table_insert(hash, (gpointer) mer_p, (gpointer) m);

exists = g_hash_table_lookup(hash, (gpointer) &mer_v);

常见的优化是将整数值直接存储为哈希表键,而不是它们的地址。然后,哈希和比较器是g_direct_hashg_direct_equal。这要求所有整数键都符合指针的大小(如果可以使用uintptr_t则保证),并且可以将任意整数强制转换为指针和返回(不受ISO C保证,但受主要平台的尊重) )。在这种情况下,插入和查找看起来像这样:

g_hash_table_insert(hash, (gpointer) mer_v, (gpointer) m);

exists = g_hash_table_lookup(hash, (gpointer) mer_v);