數學之美 系列十三 信息指紋及其應用

任何一段信息文字,都可以對應一個不太長的隨機數,作爲區別它和其它信息的指紋(Fingerprint)。只要算法設計的好,任何兩段信息的指紋都很難重複,就如同人類的指紋一樣。信息指紋在加密、信息壓縮和處理中有着廣泛的應用。

我們在圖論和網絡爬蟲一文中提到,爲了防止重複下載同一個網頁,我們需要在哈希表中紀錄已經訪問過的網址(URL)。但是在哈希表中以字符串的形式直接存儲網址,既費內存空間,又浪費查找時間。現在的網址一般都較長,比如,如果在 Google 或者百度在查找數學之美,對應的網址長度在一百個字符以上。下面是百度的鏈接

http://www.baidu.com/s?ie=gb2312&bs=%CA%FD%D1%A7%D6%AE%C3%C0&sr=&z=&cl=3&f=8
&wd=%CE%E2%BE%FC+%CA%FD%D1%A7%D6%AE%C3%C0&ct=0


假定網址的平均長度爲一百個字符,那麼存貯 200 億個網址本身至少需要 2 TB,即兩千 GB 的容量,考慮到哈希表的存儲效率一般只有 50%,實際需要的內存在 4 TB以上。即使把這些網址放到了計算機的內存中,由於網址長度不固定,以字符串的形式查找的效率會很低。因此,我們如果能夠找到一個函數,將這 200 億個網址隨機地映射到128 二進位即 16 個字節的整數空間,比如將上面那個很長的字符串對應成一個如下的隨機數:

893249432984398432980545454543

這樣每個網址只需要佔用 16 個字節而不是原來的一百個。這就能把存儲網址的內存需求量降低到原來的 1/6。這個16 個字節的隨機數,就稱做該網址的信息指紋(Fingerprint)。可以證明,只要產生隨機數的算法足夠好,可以保證幾乎不可能有兩個字符串的指紋相同,就如同不可能有兩個人的指紋相同一樣。由於指紋是固定的 128 位整數,因此查找的計算量比字符串比較小得多。網絡爬蟲在下載網頁時,它將訪問過的網頁的網址都變成一個個信息指紋,存到哈希表中,每當遇到一個新網址時,計算機就計算出它的指紋,然後比較該指紋是否已經在哈希表中,來決定是否下載這個網頁。這種整數的查找比原來字符串查找,可以快幾倍到幾十倍。

產生信息指紋的關鍵算法是僞隨機數產生器算法(prng)。最早的 prng 算法是由計算機之父馮諾伊曼提出來的。他的辦法非常簡單,就是將一個數的平方掐頭去尾,取中間的幾位數。比如一個四位的二進制數 1001(相當於十進制的9),其平方爲 01010001 (十進制的 81)掐頭去尾剩下中間的四位 0100。當然這種方法產生的數字並不很隨機,也就是說兩個不同信息很有可能有同一指紋。現在常用的 MersenneTwister 算法要好得多。

信息指紋的用途遠不止網址的消重,信息指紋的的孿生兄弟是密碼。信息指紋的一個特徵是其不可逆性, 也就是說,
無法根據信息指紋推出原有信息,這種性質, 正是網絡加密傳輸所需要的。比如說,一個網站可以根據用戶的Cookie 識別不同用戶,這個 cookie 就是信息指紋。但是網站無法根據信息指紋瞭解用戶的身份,這樣就可以保護用戶的隱私。在互聯網上,加密的可靠性,取決於是否很難人爲地找到擁有同一指紋的信息, 比如一個黑客是否能隨意產生用戶的 cookie。從加密的角度講 MersenneTwister,算法並不好,因爲它產生的隨機數有相關性。

互聯網上加密要用基於加密僞隨機數產生器(csprng)。常用的算法有 MD5 或者 SHA1 等標準,它們可以將不定長的信息變成定長的 128 二進位或者 160 二進位隨機數。值得一提的事,SHA1 以前被認爲是沒有漏洞的,現在已經被中國的王小云教授證明存在漏洞。但是大家不必恐慌, 因爲這和黑客能真正攻破你的註冊信息是還兩回事。

信息指紋的雖然歷史很悠久,但真正的廣泛應用是在有了互聯網以後,這幾年才漸漸熱門起來。 
發佈了3 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章