1. 程式人生 > >數學之美 系列十三 資訊指紋及其應用

數學之美 系列十三 資訊指紋及其應用



任何一段資訊文字,都可以對應一個不太長的隨機數,作為區別它和其它資訊的指紋(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 以前被認為是沒有漏洞的,現在已經被中國的王小云教授證明存在漏洞。但是大家不必恐慌, 因為這和黑客能真正攻破你的註冊資訊是還兩回事。

資訊指紋的雖然歷史很悠久,但真正的廣泛應用是在有了網際網路以後,這幾年才漸漸熱門起來。