使用plibsys数据结构实现多目录重复文件检测时返回错误结果的问题求助
使用plibsys数据结构实现多目录重复文件检测时返回错误结果的问题求助
各位大佬好,我最近在捣鼓一个小工具,用来检测两个甚至多个目录里的重复文件。目前的实现思路是用tinydir遍历目标目录,用plibsys的哈希表来存文件信息——具体来说,就是遍历每个文件时计算它的MD5哈希值,把这个哈希字符串作为键,对应的文件路径集合作为值存在哈希表里,这样同一个键下面的所有路径就是重复的文件。
但现在程序跑出来的结果完全不对:要么明明有很多重复文件却没检测出来,要么把完全不相关的文件当成重复的标出来。我单独测了MD5计算的部分,拿同一个文件多次计算结果都是对的;tinydir遍历目录也能正确列出所有文件,没漏掉或者多出来。想来想去,问题大概率出在plibsys哈希表的使用上,但我对着文档翻了好几遍也没找到问题所在。
想请教下有没有用过plibsys哈希表的朋友,或者做过类似功能的老哥,给我点排查方向?比如:
- 用字符串当plibsys哈希表的键时,有没有什么初始化或者比较逻辑的细节要注意?
- 插入、查询哈希表的时候,有没有容易踩的内存管理坑?比如键的字符串是不是需要特殊处理,或者值的存储有没有问题?
- 会不会是我在处理哈希表节点的时候,逻辑写错了?
我把核心的哈希表操作代码简化了一下贴出来,大家帮忙看看有没有明显问题:
// 初始化哈希表,用字符串哈希和比较函数 PHashtable *file_hash_table = p_hashtable_new(p_hash_string, p_compare_string, NULL); // 假设已经通过遍历拿到了file_md5(MD5哈希字符串)和file_full_path(文件完整路径) PHashtableNode *target_node = p_hashtable_lookup(file_hash_table, file_md5); if (target_node == NULL) { // 第一次遇到这个哈希,新建链表存路径 PList *path_list = p_list_new(); p_list_add_last(path_list, p_string_new(file_full_path)); // 插入哈希表,键是新的字符串对象 p_hashtable_insert(file_hash_table, p_string_new(file_md5), path_list); } else { // 已有该哈希,往链表加新路径 p_list_add_last((PList*)target_node->value, p_string_new(file_full_path)); }
我自己怀疑是不是字符串的内存管理出了问题?比如有没有正确创建plibsys的字符串对象,或者后续有没有不小心释放了不该释放的内存导致键值对错乱?
麻烦大家帮我分析分析,万分感谢!
内容来源于stack exchange
相关产品推荐
相关产品推荐

