uthash 将新条目添加到 <struct, struct> 哈希图中
uthash adding a new entry to a <struct, struct> hashmap
我想用 uthash 创建一个 hashmap。
我希望键和值是一个结构,包含一个字符串和一个 size_t,如下所示:
typedef struct hash_ptr {
char* string;
size_t len;
}hash_ptr;
散列 table 本身如下所示:
typedef struct hash_map_entry {
struct hash_ptr *key;
struct hash_ptr *value;
UT_hash_handle hh;
}hash_map_entry;
为了向地图添加新条目,我编写了一个名为 add_entry():
的新函数
void add_entry(hash_map_entry *map, hash_ptr *key, hash_ptr *value) {
hash_map_entry *entry;
HASH_FIND(hh, map, key, sizeof *key, entry);
if (entry == NULL) {
entry = (hash_map_entry*) malloc(sizeof *entry);
memset(entry, 0, sizeof *entry);
entry->value = value;
entry->key = key;
HASH_ADD(hh, map, key, sizeof *key, entry);
}
}
但是,在初始化并调用 add_entry() 之后...
hash_map_entry *map = NULL;
hash_ptr *key = (hash_ptr*) malloc(sizeof *key);
memset(key, 0, sizeof *key);
key->string = "Is this the Krusty Krab?";
key->len = strlen(key->string);
hash_ptr *value = (hash_ptr*) malloc(sizeof *value);
memset(value, 0, sizeof *value);
value->string = "No, this is Patrick!";
value->len = strlen(value->string);
add_entry(map, key, value);
...HASH_FIND 找不到添加的条目:
hash_map_entry *find_me;
HASH_FIND(hh, map, key, sizeof *key, find_me);
并且 find_me 为 NULL。
我遵循了 official user guide.
中关于使用结构作为键的说明
我哪里错了?
这是我能想到的最简单的修改。与原来相比的变化是:
将add_entry
的第一个参数从hash_map_entry *map
更改为hash_map_entry **map
并相应地调整代码。
使用HASH_ADD_KEYPTR
对struct hash_ptr
中的字符串内容进行哈希处理,而不是对struct hash_ptr
本身进行哈希处理。注意:代码假定 len
成员是 string
成员指向的对象的长度,以字节为单位。
与2相关,更改HASH_FIND
的用法,对struct hash_ptr
.
里面的字符串内容进行hash
结果如下:
#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"
typedef struct hash_ptr {
char* string;
size_t len;
}hash_ptr;
typedef struct hash_map_entry {
struct hash_ptr *key;
struct hash_ptr *value;
UT_hash_handle hh;
}hash_map_entry;
void add_entry(hash_map_entry **map, hash_ptr *key, hash_ptr *value) {
hash_map_entry *entry;
HASH_FIND(hh, *map, key->string, key->len, entry);
if (entry == NULL) {
entry = (hash_map_entry*) malloc(sizeof *entry);
memset(entry, 0, sizeof *entry);
entry->value = value;
entry->key = key;
HASH_ADD_KEYPTR(hh, *map, key->string, key->len, entry);
}
}
int main(void)
{
hash_map_entry *map = NULL;
hash_ptr *key = (hash_ptr*) malloc(sizeof *key);
memset(key, 0, sizeof *key);
key->string = "Is this the Krusty Krab?";
key->len = strlen(key->string);
hash_ptr *value = (hash_ptr*) malloc(sizeof *value);
memset(value, 0, sizeof *value);
value->string = "No, this is Patrick!";
value->len = strlen(value->string);
add_entry(&map, key, value);
hash_map_entry *find_me;
HASH_FIND(hh, map, key->string, key->len, find_me);
if (find_me)
{
printf("found key=\"%s\", val=\"%s\"\n", find_me->key->string, find_me->value->string);
}
else
{
printf("not found\n");
}
return 0;
}
我想用 uthash 创建一个 hashmap。
我希望键和值是一个结构,包含一个字符串和一个 size_t,如下所示:
typedef struct hash_ptr {
char* string;
size_t len;
}hash_ptr;
散列 table 本身如下所示:
typedef struct hash_map_entry {
struct hash_ptr *key;
struct hash_ptr *value;
UT_hash_handle hh;
}hash_map_entry;
为了向地图添加新条目,我编写了一个名为 add_entry():
的新函数void add_entry(hash_map_entry *map, hash_ptr *key, hash_ptr *value) {
hash_map_entry *entry;
HASH_FIND(hh, map, key, sizeof *key, entry);
if (entry == NULL) {
entry = (hash_map_entry*) malloc(sizeof *entry);
memset(entry, 0, sizeof *entry);
entry->value = value;
entry->key = key;
HASH_ADD(hh, map, key, sizeof *key, entry);
}
}
但是,在初始化并调用 add_entry() 之后...
hash_map_entry *map = NULL;
hash_ptr *key = (hash_ptr*) malloc(sizeof *key);
memset(key, 0, sizeof *key);
key->string = "Is this the Krusty Krab?";
key->len = strlen(key->string);
hash_ptr *value = (hash_ptr*) malloc(sizeof *value);
memset(value, 0, sizeof *value);
value->string = "No, this is Patrick!";
value->len = strlen(value->string);
add_entry(map, key, value);
...HASH_FIND 找不到添加的条目:
hash_map_entry *find_me;
HASH_FIND(hh, map, key, sizeof *key, find_me);
并且 find_me 为 NULL。
我遵循了 official user guide.
中关于使用结构作为键的说明我哪里错了?
这是我能想到的最简单的修改。与原来相比的变化是:
将
add_entry
的第一个参数从hash_map_entry *map
更改为hash_map_entry **map
并相应地调整代码。使用
HASH_ADD_KEYPTR
对struct hash_ptr
中的字符串内容进行哈希处理,而不是对struct hash_ptr
本身进行哈希处理。注意:代码假定len
成员是string
成员指向的对象的长度,以字节为单位。与2相关,更改
HASH_FIND
的用法,对struct hash_ptr
. 里面的字符串内容进行hash
结果如下:
#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"
typedef struct hash_ptr {
char* string;
size_t len;
}hash_ptr;
typedef struct hash_map_entry {
struct hash_ptr *key;
struct hash_ptr *value;
UT_hash_handle hh;
}hash_map_entry;
void add_entry(hash_map_entry **map, hash_ptr *key, hash_ptr *value) {
hash_map_entry *entry;
HASH_FIND(hh, *map, key->string, key->len, entry);
if (entry == NULL) {
entry = (hash_map_entry*) malloc(sizeof *entry);
memset(entry, 0, sizeof *entry);
entry->value = value;
entry->key = key;
HASH_ADD_KEYPTR(hh, *map, key->string, key->len, entry);
}
}
int main(void)
{
hash_map_entry *map = NULL;
hash_ptr *key = (hash_ptr*) malloc(sizeof *key);
memset(key, 0, sizeof *key);
key->string = "Is this the Krusty Krab?";
key->len = strlen(key->string);
hash_ptr *value = (hash_ptr*) malloc(sizeof *value);
memset(value, 0, sizeof *value);
value->string = "No, this is Patrick!";
value->len = strlen(value->string);
add_entry(&map, key, value);
hash_map_entry *find_me;
HASH_FIND(hh, map, key->string, key->len, find_me);
if (find_me)
{
printf("found key=\"%s\", val=\"%s\"\n", find_me->key->string, find_me->value->string);
}
else
{
printf("not found\n");
}
return 0;
}