Rsync 原理

想起以前做項(xiàng)目,用到了Rsync check 文件內(nèi)容双絮,未免以后忘記,現(xiàn)在整理下 大致邏輯

背景:

? ? ? ?我們新建一個(gè)文件,上傳囤攀,再改動(dòng)一點(diǎn)點(diǎn)東西软免,通用辦法就是,把改動(dòng)后的文件焚挠,上傳覆蓋以前的文件或杠,這樣不會(huì)錯(cuò),但是有個(gè)問題宣蔚,如果這個(gè)文件很大向抢,那么整個(gè)上傳就會(huì)消耗大量的時(shí)間和流量,哪怕我們只是編輯了一個(gè)標(biāo)點(diǎn)符號(hào)胚委。

解決方案:

? ? ? ?那么有沒有什么辦法挟鸠,我只上傳編輯的部分,那就萬事大吉了亩冬,但是沒有編輯的部分艘希,我怎么告訴server 呢,我可以告訴server 硅急,我沒有改變的部分的 offset 覆享,比如: 0-121 byte,180- 300byte营袜,編輯的部分我上傳data撒顿,那么最后的結(jié)果是什么呢:

0-121byte(location),122-179byte(data)荚板,180-300 byte.

?????那么凤壁,我怎么找出編輯的部分呢,大致方案如下:

? ? 1. 我將原內(nèi)容分割成若干部分(具體每部分多大跪另,根據(jù)文件大小確定)拧抖,每部分通過算法,得到兩個(gè)值免绿,sha -> sum1唧席,md5 ->sum2?

? ? 2. 我將編輯后的文件,按照同樣大小嘲驾,分割淌哟,依次對(duì)比,如果發(fā)現(xiàn)sum1 和 sum2 都一樣距淫,那么我們認(rèn)為這部分是以前的內(nèi)容绞绒,記錄下來

? ? 3. 遇到sum1 不一致,或者sum1一致榕暇,sum2 不一致的內(nèi)容(這就是為什么要通過兩個(gè)算法去校驗(yàn),sum2 準(zhǔn)確,但是消耗性能彤枢,sum1 性能消耗較低狰晚,但是不準(zhǔn)確),那么我們往后移動(dòng)一個(gè)byte缴啡,這一個(gè)byte 作為新增的內(nèi)容壁晒,記錄下位置,接著從移動(dòng)過后的位置對(duì)比

????4. 一個(gè)字節(jié)一個(gè)字節(jié)的添加太麻煩业栅,還有如果重用的部分是連續(xù)的秒咐,那么我們可以添加邏輯把連續(xù)新增的字節(jié)或者連續(xù)重用的字節(jié)連起來,最后上傳的時(shí)候碘裕,再上傳連起來的部分的offset 和data

? ? 大致的邏輯就是這樣携取,但是有個(gè)問題:

? ? 原內(nèi)容:[(sum1,sum2),(sum1,sum2),(sum1,sum2).......]

? ? 我們計(jì)算編輯后的文件的時(shí)候,拿到sum1 和sum2 帮孔,怎么去對(duì)比呢雷滋,要知道,上面的數(shù)組是相當(dāng)龐大的文兢,你要挨個(gè)去對(duì)比晤斩,我的天,性能災(zāi)難姆坚,得不償失澳泵。

? ? 有什么辦法呢,如果能想key 兼呵,value 這樣挨個(gè)對(duì)應(yīng)起來就好了烹俗,這樣,直接找key萍程,看value 是否有值幢妄。

? ??原內(nèi)容:[{sum1:{sum2:xxxxx,location :123-456}}.......]

? ? 但是,這樣有新的問題:

? ? ? ? ? ? 1. sum1 有可能碰撞(不精確)

? ? ? ? ? ? 2. sum1 還是很長茫负,key value 都很長蕉鸳,這樣的性能我們是無法接受的

? ? 如果有什么辦法,能夠?qū)um1 或者sum2 編程一個(gè)數(shù)字或者簡單的字符就好了忍法。

? ? 網(wǎng)上找找潮尝,果然有,將可以通過一個(gè)算法將sum1 變成一個(gè) 數(shù)字:

? ? ? ? ? ? ? ? f(sum1) -> 10233

? ? 我們?cè)贅?gòu)建一個(gè)hashtable 樣子饿序, 表的樣子是什么呢

? ? hashTable[10233] = i, i 表示在原文件中的第幾端勉失,至于其他的都設(shè)置成-1,最后結(jié)果

? ? hashTable[0] = -1,....hashTable[10233] = 0,......

? ? 我們拿到編輯后的文件段的sum1原探, 通過同樣的運(yùn)算乱凿, 獲得的值也是 10233顽素, 那么我們拿這個(gè)10233 反過來找hashTable, 發(fā)現(xiàn)value 不是-1徒蟆, 恭喜你可能找到了胁出,這時(shí)再對(duì)比下sum2,這樣就能最終確定了段审,這樣是不是性能提高了很多

? ? 但是還有一個(gè)問題全蝶,不同內(nèi)容的sum1 可能一樣啊,這咋整寺枉,也就是抑淫,可能第57 段和第89段的sum1都是10233,那么結(jié)果就是姥闪,后面的把前面的覆蓋始苇,結(jié)果就是 hashTabel[10233] = 89

? ? 這咋整?

? ? 我們想如果能記錄后一段甘畅,也就是在覆蓋前一段的時(shí)候能夠把前一段的location 記錄下來就好了埂蕊,ok,那么我們新定義一個(gè)變量chain疏唾,通常情況下蓄氧,chain值為-1,只有發(fā)現(xiàn)hashTable[10233]有值時(shí)槐脏,我們把后一個(gè)位置的chain 設(shè)置成前一個(gè)位置的location喉童,這樣是不是就不怕覆蓋了,結(jié)果就是顿天,假設(shè)第0堂氯,57,89 的結(jié)果都是10233牌废,那么:

hashTable[10233] = 89, data[89].chain = 57, data[57].chain = 0

代碼如下:

for I in 0..<count {

? ? ? ? ? ? ? ? let sumData = file.sums[I] ? ? ? ?

?????????? ? ? ?let t =self.getHashEntry( sum1: sumData.sum1,true)

? ? ? ? ? ? ? ? let subsum = file.sums[i]

? ? ? ? ? ? ? ? subsum.chain=hashTable[Int(t)]

? ? ? ? ? ? ? ? self.hashTable[Int(t)] = i

? ? ? ? ? ? }

perfect!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咽白,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸟缕,更是在濱河造成了極大的恐慌晶框,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懂从,死亡現(xiàn)場離奇詭異授段,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)番甩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門侵贵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缘薛,你說我怎么就攤上這事窍育】溃” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蔫骂,是天一觀的道長么翰。 經(jīng)常有香客問我牺汤,道長辽旋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任檐迟,我火速辦了婚禮补胚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘追迟。我一直安慰自己溶其,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布敦间。 她就那樣靜靜地躺著瓶逃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廓块。 梳的紋絲不亂的頭發(fā)上厢绝,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音带猴,去河邊找鬼昔汉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拴清,可吹牛的內(nèi)容都是我干的靶病。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼口予,長吁一口氣:“原來是場噩夢啊……” “哼娄周!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沪停,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤煤辨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牙甫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掷酗,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窟哺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泻轰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡且轨,死狀恐怖浮声,靈堂內(nèi)的尸體忽然破棺而出虚婿,到底是詐尸還是另有隱情,我是刑警寧澤泳挥,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布然痊,位于F島的核電站,受9級(jí)特大地震影響屉符,放射性物質(zhì)發(fā)生泄漏剧浸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一矗钟、第九天 我趴在偏房一處隱蔽的房頂上張望唆香。 院中可真熱鬧,春花似錦吨艇、人聲如沸躬它。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冯吓。三九已至,卻和暖如春疮跑,著一層夾襖步出監(jiān)牢的瞬間组贺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工祸挪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锣披,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓贿条,卻偏偏與公主長得像雹仿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子整以,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一胧辽、為什么要用rsync+sersync架構(gòu)? 1公黑、sersync是基于inotify開發(fā)的邑商,類似于inotify...
    SkTj閱讀 1,853評(píng)論 2 14
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,345評(píng)論 0 2
  • 基礎(chǔ)命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,099評(píng)論 0 0
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11
  • 前天下班路上朝蜘,在一個(gè)上面有多車道立交橋的大型十字路口恶迈,一堆堆的人待在安全線內(nèi)等綠燈。這時(shí)谱醇,一個(gè)三十歲左右的男子暇仲,專...
    楊曉木閱讀 256評(píng)論 0 4