本發(fā)明涉及數(shù)據(jù)一致性檢測技術(shù),尤其是一種基于數(shù)據(jù)一致性校驗(yàn)算法的優(yōu)化算法。
背景技術(shù):
隨著計(jì)算機(jī)的發(fā)展,數(shù)據(jù)作為企業(yè)的重要資源越來越受到重視,為了防止各種災(zāi)難讀技術(shù)局的損壞或者摧毀,建立一個(gè)可以保證數(shù)據(jù)安全和服務(wù)連續(xù)性的容災(zāi)系統(tǒng)具有十分重要的意義。在容災(zāi)系統(tǒng)中,當(dāng)災(zāi)難法神后,使用備份數(shù)據(jù)中心提供的數(shù)據(jù)可以快速的恢復(fù)本地?cái)?shù)據(jù)中心的數(shù)據(jù),保持業(yè)務(wù)的連續(xù)性,將損失降到最低。但是如果備份數(shù)據(jù)和被損壞前數(shù)據(jù)不一致,這就說明備份市局不能用來進(jìn)行對(duì)元數(shù)據(jù)的恢復(fù),這樣就會(huì)造成無法挽回的損失,所以為了確保備份數(shù)據(jù)在數(shù)據(jù)恢復(fù)時(shí)具有高可用性,就需要定期的對(duì)元數(shù)據(jù)和備份數(shù)據(jù)進(jìn)行數(shù)據(jù)一致性檢測。
數(shù)據(jù)一致性檢測技術(shù)是檢測源數(shù)據(jù)與備份數(shù)據(jù)是否一致來確保備份數(shù)據(jù)高可用性的技術(shù)。現(xiàn)有的數(shù)據(jù)一致性檢測方法主要通過快照技術(shù)、數(shù)據(jù)分塊技術(shù)和計(jì)算摘要值等技術(shù)來對(duì)源數(shù)據(jù)與備份數(shù)據(jù)同時(shí)進(jìn)行操作,得到對(duì)應(yīng)數(shù)據(jù)塊的摘要值,通過對(duì)摘要值的比對(duì)完成數(shù)據(jù)一致檢測,如果摘要值相同,源數(shù)據(jù)與備份數(shù)據(jù)就一致;不同則不一致。這其中對(duì)摘要值的計(jì)算是數(shù)據(jù)一致性校驗(yàn)中的重要環(huán)節(jié)。
在摘要值計(jì)算中,對(duì)摘要值算法的效率有一定的要求,因?yàn)閿?shù)據(jù)一致性檢測不能占用非常多的時(shí)間,這樣會(huì)影響系統(tǒng)的正常工作。對(duì)于摘要值算法,摘要值算法到的散列值越長其所能保證的數(shù)據(jù)一致性越高,但是長的散列值就要花費(fèi)大量的計(jì)算資源和時(shí)間,md5算法產(chǎn)生128位散列值,雖然不是最長的,但是作為摘要值算法很好的中和了散列值長度和計(jì)算性能的矛盾。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)以上問題,本發(fā)明提出了一種基于數(shù)據(jù)一致性校驗(yàn)算法的優(yōu)化算法。針對(duì)原有的md5摘要算法進(jìn)行研究,對(duì)原有的md5值校驗(yàn)算法進(jìn)行優(yōu)化,通過流程和策略的優(yōu)化從而提高數(shù)據(jù)校驗(yàn)算法的準(zhǔn)確性和計(jì)算效率。
本發(fā)明改進(jìn)的算法是以任意長的消息作為輸入,同樣產(chǎn)生128比特的消息摘要。
本發(fā)明的技術(shù)方案是:
一種基于數(shù)據(jù)一致性校驗(yàn)算法的優(yōu)化算法,
具體步驟如下:
步驟一:輸入信息;
步驟二:通過二進(jìn)制的轉(zhuǎn)化,將信息串轉(zhuǎn)化為等價(jià)的二進(jìn)制串;
步驟三:(1)為二進(jìn)制串添加01比特序列,使因此產(chǎn)生的字符串的長度比512的倍數(shù)少64比特;(2)掃描步驟三(1)中產(chǎn)生的字符串的任意位置,再附加64比特;
步驟四:(1)將步驟二產(chǎn)生的二進(jìn)制串劃分成長度為128比特的數(shù)據(jù)塊;(2}使用隨機(jī)數(shù)發(fā)生器生成一個(gè)128比特的二進(jìn)制鍵;(3)在128比特?cái)?shù)據(jù)塊和128比特隨機(jī)鍵中進(jìn)行逐位運(yùn)算;(4)將步驟四(3)中的輸出作為逐步的消息摘要進(jìn)行保存;
步驟五:(1)在現(xiàn)在的消息摘要和之前的消息摘要之間進(jìn)行逐位運(yùn)算;(2)返回步驟四,直至所有的輸入信息塊都處理完畢;
步驟六:將步驟五產(chǎn)生的輸出值轉(zhuǎn)化成相應(yīng)的特征值,并且將此值作為最后的消息摘要值保存。
作為輸入的信息是任意類型,包括字母,數(shù)字以及特殊字符:
message=((a-z)+(a-z)+(0-9)+(!一;))*
對(duì)于任何字符,都轉(zhuǎn)化為相應(yīng)的二進(jìn)制碼,產(chǎn)生的二進(jìn)制串包含任何數(shù)字編號(hào);然后追加一個(gè)位序列,以輸入二進(jìn)制字符串,使生成的字符串的長度比512的倍數(shù)少64;
數(shù)學(xué)形式:二進(jìn)制串長度%512=448。
對(duì)在產(chǎn)生的字符串的任意位置再附加64比特來說,它的起始點(diǎn)從[字符串的長度//3」開始。
在原有數(shù)據(jù)一致性校驗(yàn)算法md5的基礎(chǔ)上通過流程和策略的優(yōu)化從而提高數(shù)據(jù)校驗(yàn)算法的準(zhǔn)確性和計(jì)算效率。
附圖說明
圖1是md5算法流程圖圖;
圖2是優(yōu)化后數(shù)據(jù)摘要算法的流程圖。
具體實(shí)施方式
下面對(duì)本發(fā)明的內(nèi)容進(jìn)行更加詳細(xì)的闡述:
圖1是標(biāo)準(zhǔn)md5值在數(shù)據(jù)一致性校驗(yàn)中進(jìn)行數(shù)據(jù)摘要的過程。md5算法的具體實(shí)現(xiàn)過程是經(jīng)過初始化后,md5將輸入文本劃分為16個(gè)32位的分組,通過四輪計(jì)算,會(huì)得到四個(gè)32位分組的值,而md5最后所得的128位摘要值就是將這四個(gè)值級(jí)聯(lián)得出的。
圖1是標(biāo)準(zhǔn)md5值在數(shù)據(jù)一致性校驗(yàn)中進(jìn)行數(shù)據(jù)摘要的過程。md5算法的具體實(shí)現(xiàn)過程是經(jīng)過初始化后,md5將輸入文本劃分為16個(gè)32位的分組,通過四輪計(jì)算,會(huì)得到四個(gè)32位分組的值,而md5最后所得的128位摘要值就是將這四個(gè)值級(jí)聯(lián)得出的。
首先要對(duì)輸入信息進(jìn)行填充,填充的方法是在信息后面附上一個(gè)1,然后1的后面按照要求附上若干多個(gè)0。將填充完的信息再加上64位信息再填充之前的長度后,剛好使整個(gè)信息的長度是512的整數(shù)倍。進(jìn)行這樣操作的目的是保證不同信息經(jīng)過填充后不相同,方便以后的操作。
下面是四個(gè)md5算法中的鏈接變量:
a=0x01234567
b=0x89abcdef
c=0xfedcba98
d=0x76543210
計(jì)算信息中512位分組的數(shù)量,并將此數(shù)值作為循環(huán)的次數(shù)開始md5算法的主循環(huán)。為了四個(gè)鏈接變量a,b,c,d不發(fā)生改變,使用四個(gè)中間變量表示它們。md5算法的主循環(huán)一共有四輪,每一輪都要通過固有的函數(shù)進(jìn)行16次計(jì)算。這個(gè)過程是從四個(gè)中間變量中選出二個(gè),將這二個(gè)作一次非線性函數(shù)運(yùn)算,將剩余的變量加到由非線性函數(shù)運(yùn)算所有的結(jié)果中,然后將加上文本的一個(gè)子分組和一個(gè)常數(shù)的結(jié)果右移不定位,從四個(gè)中間變量中選出來一個(gè)然后加上那個(gè)結(jié)果。再從四個(gè)中間變量中選出一個(gè),然后用剛才得到的那個(gè)結(jié)果進(jìn)行替換
下面是每輪要用到的非線性函數(shù),一共是四個(gè):
f(x,y,z)=(x&y)}|((~x)&z)
g(x,y,z)=(x&z)}|(y&(~z))
h(x,y,z)=x^y^z
i}x,y,z)=y^(x|(~z))
(&:與,|:或,~:非,^:異或)
函數(shù)f的操作方式是逐位的操作:如果x,那么y,否則z。函數(shù)h是逐位奇偶操作符。四種操作為:
ff(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti)<<<s)
gg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti)<<<s)
hh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti)<<<s)
ii(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti)<<<s)
其中a,b,c,d就是替換四個(gè)鏈接變量的中間變量,<<<s表示循環(huán)左移s位,變量mj表示的含義旱信良的第j個(gè)子分組。
這四輪(64步)是:
第一輪:
ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3,22,0xclbdceee)
ff(a,b,c,d,m4,7,0xf57c0faf)
ff(d,a,b,c,ms,12,0x4787c62a)
ff(c,d,a,b,m6,17,0xa8304613)
ff(b,c,d,a,m7,22,0xfd469501)
ff(a,b,c,d,m8,7,0x698098d8)
ff(d,a,b,c,m9,12,0x8b44f7af)
ff(c,d,a,b,m10,17,0xffff5bb1)
ff(b,c,d,a,m11,22,0x895cd7be)
ff(a,b,c,d,m12,7,0x6b901122)
ff(d,a,b,c,m13,12,0xfd987193)
ff(c,d,a,b,m14,17,0xa679438e)
ff(b,c,d,a,m15,22,0x49b40821)
第二輪:
gg(a,b,c,d,m1,5,0xf61e2562)
gg(d,a,b,c,m6,9,0xc040b340)
gg(c,d,a,b,m11,14,0x265e5a51)
gg(b,c,d,a,m0,20,0xe9b6c7aa)
gg(a,b,c,d,m5,5,0xd62f105d)
gg(d,a,b,c,m10,9,0x02441453)
gg(c,d,a,b,m15,14,0xd8ale681)
gg(b,c,d,a,m4,20,0xe7d3fbc8)
gg(a,b,c,d,m9,5,0x21e1cde6)
gg(d,a,b,c,m14,9,0xc33707d6)
gg(c,d,a,b,m3,14,0xf4d50d87)
gg(b,c,d,a,m8,20,0x45sa14ed)
gg(a,b,c,d,m13,5,0xa9e3e905)
gg(d,a,b,c,m2,9,0xfcefa3f8)
gg(c,d,a,b,m7,14,0x676f02d9)
gg(b,c,d,a,m12,20,0x8d2a4c8a)
第二輪:
hh(a,b,c,d,m5,4,0xfffa3942)
hh(d,a,b,c,mb,11,0x8771f681)
hh(c,d,a,b,m11,16,0x6d9d6122)
hh(b,c,d,a,m14,23,0xfde5380c)
hh(a,b,c,d,m1,4,0xa4beea44)
hh(d,a,b,c,m4,11,0x4bdecfa9)
hh(c,d,a,b,m7,16,0xf6bb4b60)
hh(b,c,d,a,m10,23,0xbebfbc70)
hh(a,b,c,d,m13,4,0x289b7ec6)
hh(d,a,b,c,m0,11,0xeaa127fa)
hh(c,d,a,b,m3,16,0xd4ef3085)
hh(b,c,d,a,m6,23,0x04881d05)
hh(a,b,c,d,m9,4,0xd9d4d039)
hh(d,a,b,c,m12,11,0xe6db99e5)
hh(c,d,a,b,m15,16,0x1fa27cf8)
hh(b,c,d,a,m2,23,0xc4ac5665)
第四輪:
ii(a,b,c,d,m0,6,0xf4292244)
ii(d,a,b,c,m7,10,0x432aff97)
ii(c,d,a,b,m14,15,0xab9423a7)
ii(b,c,d,a,m5,21,0xfc93a039)
ii(a,b,c,d,m12,6,0x655b59c3)
ii(d,a,b,c,m3,10,0x8foccc92)
ii(c,d,a,b,m10,15,0xffeff47d)
ii(b,c,d,a,m1,21,0x85845dd1)
ii(a,b,c,d,m8,6,0x6fa87e4f)
ii(d,a,b,c,m15,10,0xfe2ce6e0)
ii(c,d,a,b,m6,15,0xa3014314)
ii(b,c,d,a,m13,21,0x4e0811a1)
ii(a,b,c,d,m4,6,0xf7537e82)
ii(d,a,b,c,m11,10,0xbd3af235)
ii(c,d,a,b,m2,15,0x2ad7d2bb)
ii(b,c,d,a,m9,21,0xeb86d391)
常數(shù)ti可以如下選擇:
在第i步中,ti是4294967296*abs(sin(i))的整數(shù)部分,ti的單位是弧度(2的32次方)。完成這四輪所有的操作后將最后所得的四個(gè)分組值進(jìn)行級(jí)聯(lián)起來就是最后的輸出值。以上是md5算法的整個(gè)操作流程。
圖2是優(yōu)化后數(shù)據(jù)摘要算法的流程圖。本發(fā)明改進(jìn)的算法是以任意長的消息作為輸入,同樣產(chǎn)生128比特的消息摘要。算法的具體步驟如下:
步驟一:輸入信息。
步驟二:通過二進(jìn)制的轉(zhuǎn)化,將信息串轉(zhuǎn)化為等價(jià)的二進(jìn)制串。
步驟三:(1)為二進(jìn)制串添加01比特序列,使因此產(chǎn)生的字符串的長度比512的倍數(shù)少64比特;(2)通過掃描步驟二(1)中產(chǎn)生的字符串的任意位置(在這種情況下,可以用規(guī)則[字符串的長度/3]來定義起始點(diǎn)),再附加64比特。
步驟四:(1)將步驟二產(chǎn)生的二進(jìn)制串劃分成長度為128比特的數(shù)據(jù)塊;(2}使用隨機(jī)數(shù)發(fā)生器生成一個(gè)128比特的二進(jìn)制鍵;(3)在128比特?cái)?shù)據(jù)塊和128比特隨機(jī)鍵中進(jìn)行逐位運(yùn)算,例如與,或,異或,然后是左移,右移,零填轉(zhuǎn)移等;c4)將步驟四(3)中的輸出作為逐步的消息摘要進(jìn)行保存。
步驟五:(1)在現(xiàn)在的消息摘要和之前的消息摘要之間進(jìn)行逐位運(yùn)算;(2)返回步驟四,直至所有的輸入信息塊都處理完畢。
步驟六:將步驟五產(chǎn)生的輸出值轉(zhuǎn)化成相應(yīng)的特征值,并且將此值作為最后的消息摘要值保存。
作為輸入的信息可以是任意類型的(空字符也被接受),它可以包括字母,數(shù)字以及特殊字符:
message=((a-z)+(a-z)+(0-9)+(!一;))*
對(duì)于任何字符,都可以轉(zhuǎn)化為相應(yīng)的二進(jìn)制碼,漢字也是如此,可以找到相應(yīng)漢字的二進(jìn)制碼,例如“知行者”的二進(jìn)制碼就是“1000000000000101",所以這個(gè)對(duì)與漢字同樣適用。
由此產(chǎn)生的二進(jìn)制串可以包含任何數(shù)字編號(hào)。然后追加一個(gè)位序列(例如“01"),以輸入二進(jìn)制字符串,使生成的字符串的長度比512的倍數(shù)少64。
數(shù)學(xué)形式:二進(jìn)制串長度%512=448
對(duì)于在產(chǎn)生的字符串的任意位置再附加64比特來說,它的起始點(diǎn)可以從[字符串的長度//3」開始?,F(xiàn)在的字符串的長度是512的整數(shù)倍,然后將字符串劃分成長度為128比特的數(shù)據(jù)塊。
產(chǎn)生的關(guān)鍵key也是128比特的,這個(gè)key可以用任何一個(gè)隨機(jī)數(shù)字生成方法來生成,這里舉例:
key=(key*39)%967
keyf=(key)。