1. 程式人生 > >如何實現檔案增量同步——演算法

如何實現檔案增量同步——演算法

問題:

如何增量同步檔案,例如一個文字檔案有10M,分別存放在A,B兩個地方,現在兩個檔案是完全一樣的,但是我馬上要在A上對這個檔案進行修改,B如何實現自動和A上的檔案保持一致,並且網路的傳輸量最少。

應用場景:

這樣的使用場景太多,這裡隨便列舉幾個

1.A機器為線上運營的機器,現在需要一臺備份的機器B,當A發生宕機的時候,或者硬碟損壞等各種認為非人為原因導致資料不可用時,可以很快從B恢復

2.SVN這樣的應用場景,不需要每次修改都向伺服器傳送並替換掉一個檔案,而是隻傳送被修改的部分

3.手機客戶端對一個文字修改,如果那個文字有2M,難道我每次更新都需要上傳整個檔案嗎?每次2M,傻子才用! 

等等.... 

解決方案:

.分而治之

計算機最重要的基本演算法思路就是分而治之,在我們眼裡,一個檔案不是一個檔案,而是一堆儲存塊,每個儲存塊可能20Byte大小,至於這個值具體多大,你可以自己設定,這裡的20Byte僅提供參考。通過這樣的方法,一個檔案被分成了很多個塊,我們只需要比對塊是否相同就可以得出哪個部分做了相應修改。

.快速校驗

剛上面提到如何比對檔案,當然這裡肯定不會把檔案的每個塊上傳去比對,那樣做就沒有意義了。快速比對這不禁讓我想起了雜湊規則,雜湊表可以通過O(1)的複雜度查詢某個key,為什麼?  因為它通過計算hash值來初步驗證key,一個key的hash值是唯一的。但是僅僅驗證hash值是不可靠的,因為hash值有可能會衝突,所以在驗證完hash值後,我們在進行key的比較來確定要找的值...

通過雜湊的思路,我們可以使用類似的方法來實現檔案增量同步,把每一個儲存塊,通過MD5計算其值,然後傳遞MD5值到伺服器,讓伺服器比對MD5來確定有沒有被修改,如若MD5值不相等,則判定這個檔案塊有被修改過

為什麼是MD5?

1)能夠將任意長度的字串轉換為128位定長字串(MD5 16) 

2)MD5能夠保證絕大部分情況下不同的值hash之後其hash值不一樣,雜湊衝突比較少

這樣就可以了嗎?

No,MD5的生成需要佔用比較長的CPU時間,所以我們需要尋找一種更簡潔的校驗方式,這裡選用Alder32 是一個比較通用的解決方案

原文連結