你去上學(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)羹蚣,比如班級(jí)學(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管呵、什么是哈希算法?
哈希算法是將文件映射為較短的固定長(zhǎng)度字符串(哈希值)喉童∑材——維基百科
任何計(jì)算機(jī)文件都由電子訊號(hào)組成。簡(jiǎn)單地說:0和1組成了全部的信息世界堂氯,即:比特世界蔑担。
比如,我們眼中的香腸圖片咽白,在比特世界里是這樣的:01010111001111010101100101110101……
我沒寫完整啤握,上萬位吧,寫完得一屋子晶框,總之就是0和1兩個(gè)數(shù)字排成了一條長(zhǎng)龍排抬,這才是這張圖片在比特世界里的本來面目懂从,我們把這串長(zhǎng)龍稱為“二進(jìn)制文件”。
我們把這條長(zhǎng)龍切碎蹲蒲,攪拌之后就得到哈希值:4f7f56ecc0b725893b59f6428258304a94e40f48
哈希值是哈希算法的最終結(jié)果番甩,是文件在互聯(lián)網(wǎng)里的編號(hào)。如果這張圖片是一個(gè)人届搁,那哈希值就是TA的指紋缘薛、TA的身份證編號(hào)。
你完全不用理解哈希算法如何把二進(jìn)制文件變成哈希值卡睦,這是數(shù)學(xué)家的事宴胧,你只要把哈希函數(shù)看作一臺(tái)屠宰機(jī)器,就能理解一切:這臺(tái)機(jī)器把任何豬都能剁成等長(zhǎng)的香腸表锻,而哈希值就是這根香腸的花紋恕齐。
除了所有哈希值都一樣長(zhǎng)之外,這些花紋有一些其他漂亮的特性瞬逊,能輕巧地用在比特世界的方方面面显歧。
2、哈希值的特性
如果你看到兩個(gè)文件有完全相同的哈希值确镊,那你立馬可以判定它們是同一文件追迟。這也是哈希值最基本的特性:相同文件的哈希值相同,即骚腥,復(fù)制后的文件與原文件哈希值相同敦间。
這容易理解,因?yàn)榧热皇莾芍灰荒R粯拥呢i束铭,那它們用相同方法做出來的香腸應(yīng)該一模一樣廓块。但如果兩只豬其他部位完全相同,哪怕它們尾巴尖上的一根毛不同契沫,那香腸最終的紋理會(huì)完全不同带猴。
源文件稍有改動(dòng),哈希值面目全非懈万。
這一特性使得用哈希值標(biāo)注的文件無法被篡改拴清,因?yàn)槟呐轮淮鄹纳蠄D一個(gè)像素,馬上就能被認(rèn)出——哈希值會(huì)完全不同会通。
另外口予,哈希值還有的特性:
第一、不可逆推:在具備編碼功能的同時(shí)涕侈,哈希算法也作為一種加密算法存在沪停。即,你無法通過分析哈希值計(jì)算出源文件的樣子,換句話說:你不可能通過觀察香腸的紋理推測(cè)出豬原來的樣子木张。
第二众辨、計(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)選美國(guó)總統(tǒng)、你從小到大每天都中六合彩掀潮,或者下一秒49個(gè)外星人在你面前排成7×7方陣……的概率菇夸。但萬一碰到了呢?我們把這種情況稱為碰撞仪吧。
越好的哈希算法發(fā)生碰撞的概率越小峻仇。
可如果只為完成“少發(fā)生碰撞”這一個(gè)目標(biāo),很容易實(shí)現(xiàn)邑商,你只要把哈希值弄得長(zhǎng)長(zhǎng)的就可以了摄咆。但哈希值最終不是純數(shù)字編號(hào)凡蚜,而是數(shù)字與字母的組合,目的也只有一個(gè):縮短哈希值長(zhǎng)度吭从,便于實(shí)際應(yīng)用朝蜘。畢竟,沒有人會(huì)帶一根1米的香腸出差涩金。
如果你要自建一個(gè)小型圖片網(wǎng)站谱醇,使用CRC-32短哈希算法給圖片貼標(biāo)簽就足夠了,它能為你提供42億種不同的標(biāo)簽步做,而且文件名長(zhǎng)度(哈希值)永遠(yuǎn)只有8位副渴。
如果你要檢索論文庫(kù),MD5算法足夠你用:哈希值稍長(zhǎng)全度,但幾乎不會(huì)有重復(fù)煮剧,能讓你做出足夠精準(zhǔn)的索引。
而商業(yè)級(jí)加密将鸵,你可以用SHA256:哈希值稍長(zhǎng)勉盅,但倒推難度極大:需要人類當(dāng)前所有計(jì)算能力總和的千萬倍……還不一定能算出來。
所以顶掉,無論是CRC-32草娜、MD5、SHA256……并沒有絕對(duì)最好的哈希算法痒筒。只有在不同場(chǎng)景下宰闰,衡量成本收益之后,才存在相對(duì)最優(yōu)簿透。
結(jié)語
二十年前议蟆,如果你去圖書館找一本名叫《美國(guó)種族簡(jiǎn)史》的書,得先思考它屬于宗教類還是歷史類萎战,然后再跑去不同的區(qū)域爬格子咐容。而現(xiàn)在,你只需輕輕一點(diǎn)蚂维,整個(gè)屏幕就會(huì)告訴你有沒有這本書戳粒,如果有,那它在哪里虫啥。
圖書館用的小規(guī)模搜索技術(shù)貼標(biāo)簽:以前是手工分類蔚约,現(xiàn)在是數(shù)據(jù)庫(kù)。
而互聯(lián)網(wǎng)級(jí)別的大規(guī)模的搜索就得靠哈希算法生產(chǎn)索引標(biāo)簽了涂籽。比如Google等搜索引擎苹祟、迅雷等下載軟件、比特幣等加密貨幣……都能通過哈希值準(zhǔn)確定位目標(biāo)。
即使哈希算法乍看起來毫不起眼树枫,無非做出了一串奇怪的字符直焙,但它卻是比特世界里的板磚,能搭出高樓大廈砂轻,能讓比特世界更有序奔誓。即使離你再遠(yuǎn)的信息,在哈希算法的幫助下搔涝,都可以讓你觸手可及厨喂。
附:從今天起,你可以自己哈献剩——哈希工具
1蜕煌、哈希文件:http://www.atool.org/file_hash.php
哈希了前文香腸圖片,請(qǐng)注意最下方的“4f7f”開頭的哈希值即為前文哈希值诬留。
2斜纪、哈希字符:http://www.kjson.com/encrypt/hash/?fm=map
字符“Hello”用SHA256哈希算法得出的哈希值為:185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
恭喜你,今天又在數(shù)字世界里精進(jìn)了一步故响。
本文于2017年10月22日發(fā)布于微信公眾號(hào): 概念地圖 gainianditu