我正在使用哈希表实现UThash。
我使用原语插入元素:
HASH_ADD(hh,hash_table,key,keylen,elem);并使用原语检索元素:
HASH_FIND(hh,hash_table,key,keylen,elem);由于某些原因我不知道,当我调用一个函数时,散列查找的行为正在被修改。也就是说,uthash没有找到表中存在的元素。
我怀疑记忆在某种程度上被破坏了。
触发此失败的函数不需要执行任何代码就可以使UThash失败:
//Note: ct = custom_type
int func1(ct1 *ptr1, ct2 *ptr2, ct3 *ptr3,char **buffer,size_t *size)
{
HASH_FIND(...) //does not work
/**
* code
*/
return 0;
}
int func2(ct1 *ptr1,ct2 *ptr2,ct3 *ptr3)
{
char *buffer;
size_t buf_size;
/**
* code
*/
HASH_FIND(...) // works!
if(func1(ptr1,ptr2,ptr3,&buffer,&buf_size)){
//code
}/*error*/
return 0;
}
int func3(ct1 *ptr1,ct2 *ptr2,ct3 *ptr3)
{
char *buffer;
size_t buf_size;
HASH_FIND(...) // works!
if(func1(ptr1,ptr2,ptr3,&buffer,&buf_size)){
//code
}/*error*/
/**
* code
*/
return 0;
}因此,在func2()和func3()中都会发生相同的行为。hash_find()在调用func1()后开始失败。
所有其余的代码都完美而正确地执行。
我最明显的问题是什么会导致这种类型的失败?
感谢您的阅读,并随时询问任何其他信息。
发布于 2012-12-29 16:43:15
这可能是通过向散列中添加几个具有相同键的项造成的。如果使用uthash,则需要确保结构中没有重复的键,或者提供一个包装器函数,它将用新项替换旧项。否则,结构的行为是不可预测的,并可能导致您描述的失败。
来自uthash用户指南
如果您的程序有可能生成重复的键,则必须在将键添加到哈希之前显式检查其唯一性。如果键已经在哈希中,则可以简单地修改散列中的现有结构,而不是添加项。在哈希表中添加两个具有相同键的项是错误的。
发布于 2015-03-17 15:10:29
这是因为您是在散列指针,而不是数据。
使用克耶PTR。
发布于 2016-02-03 09:24:40
当我的密钥具有未签名字符类型时,在用int HASH_FIND_INT替换它之后,我也遇到了类似的问题。进一步的考察表明,符号字符和无符号字符是不合适的,而short int和无符号短int似乎也很好。
对于哈希函数计算算法来说,大概有8位是不够的。注意,带有无符号字符操作的原始代码是间歇性的,代码在某些构建中工作,而在其他构建中不工作(与uthash无关的更改)。
结论:使用符号的int键进行HASH_FIND_INT的正确手术,或使用短int或无符号短,则由您自己承担风险。
https://stackoverflow.com/questions/13827769
复制相似问题