0

私は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 。

助けてください。ありがとう。

4

1 に答える 1

4

使用するには、64ビットキーのアドレスをハッシュテーブルに格納する必要がありg_int64_hashます。したがって、正しいルックアップは次のようになります。g_int64_equal

exist_m = g_hash_table_lookup(hash, &mer_v);

このハッシャー/コンパレータを使用するには、すべてのキーを動的に割り当て、それらのアドレスをとの両方に渡す必要がありg_hash_table_insertますg_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);
于 2013-03-26T07:20:55.820 に答える