c - 如何使用 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 我真的很感激一些关于如何做到这一点的帮助!太感谢了!
解决方案
如果您只是想学习,那么为此实现自定义哈希表将是一种很好的体验。但是,如果您只是想获得一些工作代码,那么您就过于复杂了。只需使用 a GHashTable
of GPtrArray
s。类似的东西(未经测试,主要来自内存,多年来我还没有真正使用过 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));
}
除非您处于对性能非常关键的循环中,否则这应该没问题。
推荐阅读
- javascript - CodenameOne 到 VueJS 来回通信
- reactjs - 如何测试从子组件调用的父方法?
- python - 如何使用特定列系统地比较两个 Pandas 数据框中的所有行并返回差异?
- json - Esp 8266 解析 json 异步
- python - 如何使用带有 GET 的 Python 套接字发送 https://jsonplaceholder.typicode.com/todos/1?
- c# - 无法将 UTF-8 文件中的特殊字符转换为 ANSI
- python - 如何检查列中的模式条目并计算模式数量?
- typescript - 使用所有默认属性值初始化 Typescript 接口临时对象
- php - .php 文件的 503 服务不可用错误
- shell - 如何使用 Shell 脚本放置数据透视表