8

更新:我现在为 ssdeep C API 编写了一个名为php_ssdeep的 PHP 扩展,以促进 PHP 中的模糊散列和散列比较。更多信息可以在我的博客上找到。我希望这对人们有所帮助。

我参与在 Linux 机器上用 PHP 编写自定义文档管理应用程序,该应用程序将存储各种文件格式(可能有 1000 个文件),我们需要能够检查之前是否已上传文本文档以防止数据库中的重复.

本质上,当用户上传一个新文件时,我们希望能够向他们展示一个重复文件或包含类似内容的文件列表。这将允许他们选择一个预先存在的文件或继续上传他们自己的文件。

类似的文档将通过查看其内容中的类似句子以及可能动态生成的关键字列表来确定。然后,我们可以向用户显示匹配百分比,以帮助他们找到重复项。

您能否推荐任何用于此过程的软件包以及您过去可能如何完成此操作的任何想法?

我认为可以通过获取所有文本内容和

  • 剥离空白
  • 删除标点符号
  • 转换为小写或大写

然后形成一个 MD5 散列来与任何新文档进行比较。例如,如果用户编辑文档以添加额外的段落分隔符,则删除这些项目应该有助于防止找不到重复项。有什么想法吗?

这个过程也可能作为夜间作业运行,如果计算要求太大而无法实时运行,我们可以在用户下次登录时通知用户任何重复项。然而,实时将是首选。

4

2 回答 2

5

更新:我现在为 ssdeep C API 编写了一个名为php_ssdeep的 PHP 扩展,以促进 PHP 中的模糊散列和散列比较。更多信息可以在我的博客上找到。我希望这对人们有所帮助。

我找到了一个程序,它的创建者 Jesse Kornblum 称之为“模糊散列”。基本上,它对文件进行哈希处理,可用于检测相似文件或相同匹配项。

它背后的理论记录在这里:使用上下文触发分段散列识别几乎相同的文件

ssdeep是程序的名称,它可以在 Windows 或 Linux 上运行。它旨在用于取证计算,但它似乎足以满足我们的目的。我在一台旧的 Pentium 4 机器上做了一个简短的测试,通过一个 23MB 的哈希文件(不到 135,000 个文件的哈希)寻找两个文件的匹配项大约需要 3 秒。那段时间还包括为我正在搜索的两个文件创建哈希值。

于 2009-11-13T16:23:28.880 回答
1

我正在处理 web2project 中的一个类似问题,在四处询问和挖掘之后,我得出了“用户不在乎”的结论。只要用户可以通过自己的名称找到自己的文档,拥有重复的文档对用户来说并不重要。

话虽如此,这是我正在采取的方法:

  • 允许用户上传与他们想要的任何项目/任务相关联的文档;
  • 应该重命名该文件以防止有人通过 http.. 获取它,或者更好地存储在 Web 根目录之外。用户仍然会在系统中看到他们的文件名,如果他们下载它,您可以使用“正确”文件名设置标题;
  • 在将来的某个时候,处理文档以查看是否有重复项。但此时,我们并没有修改文档。毕竟,更改空格或大写字母可能有重要原因;
  • 如果有欺骗,删除新文件,然后链接到旧文件;
  • 如果没有骗子,什么也不做;
  • 为搜索词索引文件 - 根据文件格式,有很多选项,即使是 Word 文档;

在所有这一切中,我们不会告诉用户它是重复的……他们不在乎。关心的是我们(开发人员、数据库管理员等)。

是的,即使他们稍后上传文件的新版本,这也有效。首先,您删除对文件的引用,然后 - 就像在垃圾回收中一样 - 只有在对旧文件的引用为零时才删除旧文件。

于 2009-11-13T13:31:55.440 回答