首页 > 解决方案 > 如何使用 glib 处理哈希表中的冲突

问题描述

我正在尝试使用哈希表存储一些数据,我决定使用 glib。

所以我可以使用 g_str_hash 来生成密钥,但是有相等的字符串。基本上,数据来自一个 csv 文件,例如,同一个 id 有多行。而且我想使用 id 作为键,并且仍然有单独的行。

所以我试图从 g_str_hash 实现一个类似的算法,但是当密钥已经附加了一些东西时,它会转到下一个可用空间。但是由于关于类型和如何做的一些问题,我遇到了困难。

  guint hash(char * key, GHashTable *hasht ) {
    unsigned int hash = 5381;
    int c;

    while ((c = *(key++))) {
      hash = ((hash << 5) + hash) + c;
    }

    //this is where i get lost on how to check if there is alreay something stored using the hash I generated before

    while (g_hash_table_contains(hasht, hash))
    {
      hash++;
    }
    
    return hash;
  }

Soo 我真的很感激一些关于如何做到这一点的帮助!太感谢了!

标签: cglib

解决方案


如果您只是想学习,那么为此实现自定义哈希表将是一种很好的体验。但是,如果您只是想获得一些工作代码,那么您就过于复杂了。只需使用 a GHashTableof GPtrArrays。类似的东西(未经测试,主要来自内存,多年来我还没有真正使用过 C 中的 GLib):

/* create hash table */
GHashTable* ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_ptr_array_unref);

for (/* each record in CSV */) {
  GPtrArray* arr = g_hash_table_lookup(ht, record->id);
  if (arr == NULL) {
    /* We don't have an entry for that ID yet */
    arr = g_ptr_array_new_full(1, g_free);
    g_hash_table_insert(ht, g_strdup(record->id), arr);
  }
  g_ptr_array_add(arr, g_strdup(record->value));
}

除非您处于对性能非常关键的循环中,否则这应该没问题。


推荐阅读