Hash 值是區(qū)塊鏈上常用到的一個(gè)概念。簡(jiǎn)單說(shuō)來(lái)Hash值是一段信息的摘要 (文件的身份證號(hào)碼)槽棍。具有固定長(zhǎng)度捉蚤,唯一性,以及不可逆性炼七。哈希值可用于許多操作缆巧,包括身份驗(yàn)證和數(shù)字簽名。
1:什么是Hash值:
Hash值(信息摘要)就是給信息通過(guò)一定的方法賦予一個(gè)簡(jiǎn)化的代號(hào)豌拙,簡(jiǎn)化后的代號(hào)就是這段信息的Hash值陕悬。類似于讓一個(gè)居民獲得身份證號(hào)碼。居民的名字就是信息本身按傅,身份證編號(hào)的方式就是Hash函數(shù)捉超,而身份證號(hào)就是這段信息的Hash值。
2:Hash值的特點(diǎn)
固定長(zhǎng)度:同一種處理方式得到的Hash值長(zhǎng)度一定唯绍,例如常用的MD5算法就給信息賦予128bit拼岳,也就是128個(gè)0和1的二進(jìn)制串。為了便于理解况芒,將128個(gè)0和1的二進(jìn)制串轉(zhuǎn)換成了16進(jìn)制惜纸。由于每4個(gè)bit表示一個(gè)16進(jìn)制,所以128/4 = 32 換成16進(jìn)制表示后绝骚,為32位了耐版。這和居民身份證號(hào)碼一樣,每個(gè)人的身份證的號(hào)碼長(zhǎng)度都是固定的(現(xiàn)在的長(zhǎng)度一般為18位)压汪。
唯一性:任何一段信息只能有唯一的Hash值 (一個(gè)居民只能有一個(gè)身份證號(hào))粪牲。即便是改變信息 中的任何一個(gè)內(nèi)容,就會(huì)引起整個(gè)Hash值出現(xiàn)巨大的差別止剖。例如以下兩個(gè)信息雖然只有一個(gè)字母的差別腺阳,但Hash值經(jīng)過(guò)MD5運(yùn)算后差別巨大湿滓。由于Hash值具有128bit,兩個(gè)Hash相同的概率是2的128次方之一舌狗。但因?yàn)榇嬖谥展簦ň褪怯型惶焐盏娜说娜巳簲?shù)只需要約70人而非我們第一映像中的366人)的情況叽奥,兩個(gè)Hash相同的概率是2的64次方之一,這是一個(gè)極小極小的數(shù)字——而即便是在MD5被王小云教授破解之后痛侍,其碰撞概率上限也高達(dá)2的40次方分之一朝氓。
? ? ?MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
? ? ?MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8";
不可逆性:這個(gè)與用果汁機(jī)榨果汁很類似。你可以把蘋(píng)果榨成蘋(píng)果汁和果渣主届,但不可能把蘋(píng)果汁和果渣還原成蘋(píng)果赵哲。從Harsh值不可能推算出原本的信息是什么。
3: 為什么需要Hash值(數(shù)據(jù)摘要)
(a)便于數(shù)據(jù)的查找:因?yàn)閿?shù)據(jù)內(nèi)容可能很大君丁,如果在查找數(shù)據(jù)時(shí)需要將所有的數(shù)據(jù)都全部瀏覽一遍枫夺,效率就會(huì)非常低下。但如果將每個(gè)數(shù)據(jù)后面都能通過(guò)一個(gè)函數(shù)將其用編號(hào)表示绘闷,那在查找數(shù)據(jù)時(shí)就可以簡(jiǎn)單查找有限的編號(hào)即可橡庞。例如我想要在電腦中查詢信息"區(qū)塊鏈學(xué)習(xí)筆記一Hash值的含義"可以簡(jiǎn)單的查找Hash值為“0001”的文檔。
"區(qū)塊鏈學(xué)習(xí)筆記一Hash值的含義"---》Hash函數(shù)---》“0001"
(b)便于數(shù)據(jù)的校驗(yàn):這是Hash值最重要的作用之一印蔗。由于Hash值的以上一些特點(diǎn)扒最,當(dāng)收件人在收到信息后只需要對(duì)文件Q'進(jìn)行一次Hash運(yùn)算,如果得到的Hash值與其收到的Hash值一致华嘹,則可以斷定文件Q'=文件Q即文件沒(méi)有遭到篡改吧趣。
也正是基于Hash值可校驗(yàn)的特點(diǎn),可以將Hash值與二叉樹(shù)Merkle Tree結(jié)合耙厚。二叉樹(shù)Merkle Tree中每個(gè)非葉子節(jié)點(diǎn)節(jié)點(diǎn)下面分兩個(gè)枝干强挫,每個(gè)非葉子節(jié)點(diǎn)的Hash值可以根據(jù)它下面所有的葉子節(jié)點(diǎn)值進(jìn)過(guò)一定的運(yùn)算得到。故收件人可以在收到信息后薛躬,先比對(duì)節(jié)點(diǎn)1的Hash值,若節(jié)點(diǎn)1沒(méi)有錯(cuò)誤則無(wú)需進(jìn)行進(jìn)一步的比對(duì)俯渤。若發(fā)現(xiàn)節(jié)點(diǎn)1錯(cuò)誤可以繼續(xù)比對(duì)節(jié)點(diǎn)2和3的值。發(fā)現(xiàn)節(jié)點(diǎn)3無(wú)誤則可以放棄比對(duì)節(jié)點(diǎn)6和7. 找到錯(cuò)誤來(lái)自節(jié)點(diǎn)2泛豪,再依次對(duì)節(jié)點(diǎn)4和5運(yùn)算Hash值并發(fā)現(xiàn)錯(cuò)誤源于自節(jié)點(diǎn)4.然后收件人可以重新要求發(fā)信人發(fā)送節(jié)點(diǎn)4的數(shù)據(jù)從而使整個(gè)數(shù)據(jù)和發(fā)件人的保持一致稠诲。
參考資料:
(1)從零開(kāi)始學(xué)習(xí)區(qū)塊鏈(1)微信公眾號(hào):區(qū)塊鏈大師
(2)hash與消息摘要的關(guān)系是什么侦鹏?知乎?車小胖
(3)到底什么是hash?知乎
(4)生日攻擊是什么诡曙,有什么用? 知乎 月海