你去上學(xué),班主任會(huì)告訴你一個(gè)學(xué)號(hào);畢業(yè)后上班,HR會(huì)給你一個(gè)工號(hào);你回家,抬頭看得到門牌;你去桑拿,前臺(tái)會(huì)給你一塊手牌;
站在管理者的角度看,為了把一攤事管得有秩序,就得排序。這樣協(xié)作系統(tǒng)能定位目標(biāo),更好地服務(wù)。否則,課程沒法排,工資沒法算,快遞員找不到你家,甚至在你洗完澡結(jié)賬時(shí)都會(huì)糾結(jié)半天,因?yàn)榍芭_(tái)搞不清你到底吃了多少果盤。
編號(hào),要解決兩個(gè)問題:
1)能定位;
2)無重號(hào)。
小規(guī)模編號(hào),比如班級學(xué)號(hào),從1、2、3……開始,就能解決問題;中等規(guī)模的如大企業(yè)工號(hào),數(shù)字前面得加個(gè)字母:A120908;大規(guī)模編號(hào)如身份證系統(tǒng),別管誰進(jìn)來,統(tǒng)一18位數(shù)字標(biāo)簽貼在你的身份證上。
但,如果是給互聯(lián)網(wǎng)里的所有文件編號(hào),標(biāo)簽應(yīng)該如何貼呢?那可是星辰大海呀,如果按老辦法排序,那得到千年后才能給你現(xiàn)在看的這篇文章編上號(hào)。而且遇到重號(hào)問題如何解決?是否專門安排公務(wù)員管這攤事?
那有沒有效率更高的編號(hào)方法?有,答案是哈希算法。
1、什么是哈希算法?
哈希算法是將文件映射為較短的固定長度字符串(哈希值)?!S基百科
任何計(jì)算機(jī)文件都由電子訊號(hào)組成。簡單地說:0和1組成了全部的信息世界,即:比特世界。
比如,我們眼中的香腸圖片,在比特世界里是這樣的:01010111001111010101100101110101……
我沒寫完整,上萬位吧,寫完得一屋子,總之就是0和1兩個(gè)數(shù)字排成了一條長龍,這才是這張圖片在比特世界里的本來面目,我們把這串長龍稱為“二進(jìn)制文件”。
我們把這條長龍切碎,攪拌之后就得到哈希值:4f7f56ecc0b725893b59f6428258304a94e40f48
哈希值是哈希算法的最終結(jié)果,是文件在互聯(lián)網(wǎng)里的編號(hào)。如果這張圖片是一個(gè)人,那哈希值就是TA的指紋、TA的身份證編號(hào)。
你完全不用理解哈希算法如何把二進(jìn)制文件變成哈希值,這是數(shù)學(xué)家的事,你只要把哈希函數(shù)看作一臺(tái)屠宰機(jī)器,就能理解一切:這臺(tái)機(jī)器把任何豬都能剁成等長的香腸,而哈希值就是這根香腸的花紋。
除了所有哈希值都一樣長之外,這些花紋有一些其他漂亮的特性,能輕巧地用在比特世界的方方面面。
2、哈希值的特性
如果你看到兩個(gè)文件有完全相同的哈希值,那你立馬可以判定它們是同一文件。這也是哈希值最基本的特性:相同文件的哈希值相同,即,復(fù)制后的文件與原文件哈希值相同。
這容易理解,因?yàn)榧热皇莾芍灰荒R粯拥呢i,那它們用相同方法做出來的香腸應(yīng)該一模一樣。但如果兩只豬其他部位完全相同,哪怕它們尾巴尖上的一根毛不同,那香腸最終的紋理會(huì)完全不同。
源文件稍有改動(dòng),哈希值面目全非。
這一特性使得用哈希值標(biāo)注的文件無法被篡改,因?yàn)槟呐轮淮鄹纳蠄D一個(gè)像素,馬上就能被認(rèn)出——哈希值會(huì)完全不同。
另外,哈希值還有的特性:
第一、不可逆推:在具備編碼功能的同時(shí),哈希算法也作為一種加密算法存在。即,你無法通過分析哈希值計(jì)算出源文件的樣子,換句話說:你不可能通過觀察香腸的紋理推測出豬原來的樣子。
第二、計(jì)算極快:哈希一部20G高清電影和一個(gè)5K文本文件復(fù)雜度相同,計(jì)算量都極小,可以在0.1秒內(nèi)得出結(jié)果。也就是說,不管豬有多肥,骨頭多硬,做成香腸都只要眨眨眼的時(shí)間,
能用極快的速度給你的文件編出不重復(fù)的號(hào)碼,而且任何人都無法通過這個(gè)號(hào)碼推算出文件原來的樣子,這就是哈希算法的意義。
把文件切碎和攪拌的過程就是哈希算法,而切碎和攪拌的動(dòng)作,稱為加密和壓縮,而不同的燒菜師傅會(huì)有不同的刀法,于是就有了很多哈希算法,比如:CRC-32、MD5和SHA1……名字雖然唬人,可它們之間只是張家?guī)煾岛屠罴規(guī)煾档膮^(qū)別,但不同師傅之間的刀功卻有高下,那差距究竟在哪里呢?
3、什么是好的哈希算法?
正如前文維基百科的定義:哈希算法只是將文件映射為哈希值,“映射”的意思是投影。既然是投影,那總會(huì)不同的人有一模一樣的影子。所以最終在數(shù)學(xué)意義上,哈希會(huì)發(fā)生重號(hào),只是重號(hào)概率小到我們難以理解地接近零。
這種無限接近零的概率類似于:明天一早你突然當(dāng)選美國總統(tǒng)、你從小到大每天都中六合彩,或者下一秒49個(gè)外星人在你面前排成7×7方陣……的概率。但萬一碰到了呢?我們把這種情況稱為碰撞。
越好的哈希算法發(fā)生碰撞的概率越小。
可如果只為完成“少發(fā)生碰撞”這一個(gè)目標(biāo),很容易實(shí)現(xiàn),你只要把哈希值弄得長長的就可以了。但哈希值最終不是純數(shù)字編號(hào),而是數(shù)字與字母的組合,目的也只有一個(gè):縮短哈希值長度,便于實(shí)際應(yīng)用。畢竟,沒有人會(huì)帶一根1米的香腸出差。
如果你要自建一個(gè)小型圖片網(wǎng)站,使用CRC-32短哈希算法給圖片貼標(biāo)簽就足夠了,它能為你提供42億種不同的標(biāo)簽,而且文件名長度(哈希值)永遠(yuǎn)只有8位。
如果你要檢索論文庫,MD5算法足夠你用:哈希值稍長,但幾乎不會(huì)有重復(fù),能讓你做出足夠精準(zhǔn)的索引。
而商業(yè)級加密,你可以用SHA256:哈希值稍長,但倒推難度極大:需要人類當(dāng)前所有計(jì)算能力總和的千萬倍……還不一定能算出來。
所以,無論是CRC-32、MD5、SHA256……并沒有絕對最好的哈希算法。只有在不同場景下,衡量成本收益之后,才存在相對最優(yōu)。
結(jié)語
二十年前,如果你去圖書館找一本名叫《美國種族簡史》的書,得先思考它屬于宗教類還是歷史類,然后再跑去不同的區(qū)域爬格子。而現(xiàn)在,你只需輕輕一點(diǎn),整個(gè)屏幕就會(huì)告訴你有沒有這本書,如果有,那它在哪里。
圖書館用的小規(guī)模搜索技術(shù)貼標(biāo)簽:以前是手工分類,現(xiàn)在是數(shù)據(jù)庫。
而互聯(lián)網(wǎng)級別的大規(guī)模的搜索就得靠哈希算法生產(chǎn)索引標(biāo)簽了。比如Google等搜索引擎、迅雷等下載軟件、比特幣等加密貨幣……都能通過哈希值準(zhǔn)確定位目標(biāo)。
即使哈希算法乍看起來毫不起眼,無非做出了一串奇怪的字符,但它卻是比特世界里的板磚,能搭出高樓大廈,能讓比特世界更有序。即使離你再遠(yuǎn)的信息,在哈希算法的幫助下,都可以讓你觸手可及。
附:從今天起,你可以自己哈?!9ぞ?/p>
1、哈希文件:http://www.atool.org/file_hash.php
哈希了前文香腸圖片,請注意最下方的“4f7f”開頭的哈希值即為前文哈希值。
2、哈希字符:http://www.kjson.com/encrypt/hash/?fm=map
字符“Hello”用SHA256哈希算法得出的哈希值為:185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
恭喜你,今天又在數(shù)字世界里精進(jìn)了一步。
本文于2017年10月22日發(fā)布于微信公眾號(hào): 概念地圖 gainianditu
