2009-11-13 67 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