You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:48:10