2009-11-13 65 views
8

更新:我现在已经写了一个PHP扩展名为php_ssdeep为ssdeep C API,以方便在PHP模糊哈希和哈希比较本身。可以找到更多的信息over at my blog。我希望这对人们有帮助。在文档管理应用程序检查文档的重复和类似文件

我参与编写一个自定义文档管理应用程序在Linux上,它将存储各种文件格式(潜在的1000个文件),并且我们需要能够检查文本文件是否已经上传以防止数据库中的重复。

本质上讲,当一个用户上传,我们希望能够与那些要么重复或包含类似内容的文件列表展示他们的新文件。这将允许他们选择其中一个已存在的文件或继续上传自己的文件。

类似的文件将通过其类似sentances也许关键字动态生成的列表内容寻找确定。然后,我们可以向用户显示百分比匹配,以帮助他们找到重复项。

你能推荐这个过程中的任何包和一个如何在过去所做的任何想法?

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

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

然后形成一个完成MD5哈希与任何新文档进行比较。如果用户编辑文档以添加额外的段落符号,则将这些项目剥离应有助于防止找不到模糊。有什么想法吗?

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

+0

使用MD5散列只会帮助您处理两个完全相同的文档。如果只有一个字符不同,则生成的MD5散列并不相近(这是散列点之一)。因此,这不适合寻找类似的文件... – Franz 2009-11-13 13:30:01

+0

我意识到这一点。这就是为什么我提到用于查找精确匹配而不是类似文件的技术。 – Treffynnon 2009-11-13 14:33:28

回答

5

更新:现在我已经写了一个PHP扩展名为php_ssdeep为ssdeep C API,以方便模糊散列和散列比较在PHP本身。可以找到更多的信息over at my blog。我希望这对人们有帮助。

我发现一个程序,它的创建者Jesse Kornblum称之为“模糊散列”。基本上,它使得可以用来检测类似文件或相同匹配的文件的哈希值。

其背后的理论是记录在这里:Identifying almost identical files using context triggered piecewise hashing

ssdeep是程序的名称,它可以在Windows或Linux上运行。它旨在用于法医计算,但它似乎适合我们的目的。我在一台旧的Pentium 4机器上做了一个简短的测试,通过一个23MB的散列文件(只有135,000个文件的散列)需要3秒左右的时间来查找两个文件的匹配。那段时间包括为我正在搜索的两个文件创建哈希。

1

我正在研究web2project中的类似问题,并且在询问和挖掘之后,我得出了“用户不关心”的结论。有重复的文件不只要不此事给用户,因为他们可以通过自己的名字找到自己的文档。

话虽这么说,这里是我采用的方法:

  • 允许用户上传文档它取项目,他们希望/任务相关联;
  • 该文件应该被重新命名为防止有人得到它通过HTTP ..或更好的存储Web根目录之外。用户仍然可以在系统中看到他们的文件名,如果他们下载了它,你可以用“适当的”文件名来设置标题;
  • 在未来的某个时候,看到处理文档,如果有重复..在这一点上,虽然,我们不修改文件。毕竟,可能有重要的原因是空白或大写字母被改变;
  • 如果有欺骗,删除新文件,然后链接到旧的;
  • 如果没有笨蛋,什么也不做;
  • 索引文件的搜索条件 - 根据文件格式,有很多选项,即使是Word文档;

纵观所有这些,我们不会告诉用户它是重复的...他们不在乎。这是我们(开发人员,数据库管理员等)关心。

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

+0

有趣的想法。我们的系统中不能有重复文件,因为这些文件是从一个中心位置跨越多个不同的站点使用的,所有站点必须同时更新。 我并不是建议修改文档本身。就是这样,哈希匹配可以尽可能地匹配类似的文件。如果有匹配,那么我会要求用户接受当前可用的文件,或者使用正在上传的新文件进行更新,或者将其作为他们绝对必须的另一个文件添加。 我无法删除一个旧文件,因为它对用户来说不透明。 – Treffynnon 2009-11-13 14:40:35

+0

对不起,我误解了我的回应。 我的观点是,通过在比较文档之前对其进行修改,意味着您并未实际比较文档......您正在比较修改过的文档。例如,“你好,我的名字是基思”与“你好,我的名字是基思”是同一句话。从概念上讲,它们是相同的,但是不能在第一个字母中使用我的名字可能是一个错字。您提出的想法会将这些文档视为相同,并将其标记为重复。 – CaseySoftware 2009-11-15 19:03:16

+0

这正是我希望做的。 :)他们基本上是同一句话。一个只是有一个错字。因此,我希望他们更新现有文档,而不是上传新文档。 – Treffynnon 2009-11-16 09:21:05