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

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

本质上,当用户上传新文件时,我们希望能够向他们提供重复或包含相似内容的文件列表。然后,他们可以选择预先存在的文档之一或继续上传自己的文档。

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

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

我认为直接复制可以通过获取所有文本内容来完成

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

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

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

有帮助吗?

解决方案

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

我发现了一个程序,它的创建者 Jesse Kornblum 称之为“模糊哈希”。基本上,它生成文件的哈希值,可用于检测相似的文件或相同的匹配项。

其背后的理论记录如下: 使用上下文触发的分段哈希来识别几乎相同的文件

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

其他提示

我正在 web2project 中处理类似的问题,经过询问和挖掘后,我得出了“用户不关心”的结论。有重复的文件 对于用户来说只要他们能够通过自己的名称找到自己的文档就很重要。

话虽这么说,这是我正在采取的方法:

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

在整个过程中,我们没有告诉用户这是重复的......他们不在乎。关心的是我们(开发人员、数据库管理员等)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top