如何給你的文件設(shè)定獨(dú)一無二的編號(hào)?

你去上學(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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 所有貨幣都需要一些方法來控制供應(yīng),并強(qiáng)制執(zhí)行各種安全屬性以防止作弊。在法定貨幣方面,像中央銀行這樣的組織控制貨幣供...
    Nutbox_Lab閱讀 3,346評論 1 3
  • 最近電視、新聞、網(wǎng)站經(jīng)常有講到比特幣,但普通人經(jīng)常被比特幣的各種信息搞得一頭霧水,到底什么是比特幣,它是誰開發(fā)的,...
    納蘭三少閱讀 3,738評論 0 17
  • 我和狗喝開始返程了。 狗喝是個(gè)老頭,一個(gè)和名字一樣讓人惡心的老頭。他邋里邋遢,渾身散發(fā)著死老鼠味;他癡呆呆地笑,你...
    yhj靈閱讀 323評論 0 0
  • 夜,是冷的 穿過馬路 雙腳邁開徑直向前過紅綠燈 腦子驚覺已換了住處 方向是反的 那住了3年半的3米小陽臺(tái) 離目的地...
    毛毛靜丫閱讀 143評論 4 1
  • 2016-12-09 夜晚總能給人另一個(gè)自我 我沉浸在黑色里 陶醉于它賜予我的夢里 我永遠(yuǎn)會(huì)奔跑,一直在尋找 夢里...
    鯨沉海底溫柔呼吸閱讀 194評論 0 0

友情鏈接更多精彩內(nèi)容