在前面我提到選擇每個編碼塊都需要的源碼塊的數(shù)量,即度分布,是很重要的,它確實重要。理想情況下,我們需要生成一些只包含一個源碼塊的編碼塊,然后可以開始譯碼了,大多數(shù)編碼塊依賴很少的其他編碼塊。這種理想的分布是存在的,叫做理想孤波分布。
不幸的是,理想孤波分布在實際情況中并沒有這么理想,正如隨機變量使得有些源碼塊不被任何編碼塊包含,或者當所有知道的塊用完之后譯碼停止了。理想孤波分布的一個變形,叫做穩(wěn)健孤波分布,在這方面進行了改進,用非常少的源碼塊生成更多的碼塊,也通過合并所有的或幾乎所有的源碼塊生成一些碼塊,來幫助破譯最后一些源碼塊。
簡而言之,這就是噴泉碼的,更確切的說是LT碼的,工作原理。LT碼是已知的噴泉碼中效率最低的,但是最易解釋的。如果你想進一步學習,我強烈推薦讀這篇關(guān)于噴泉碼的技術(shù)論文,也可以讀Raptor碼,Raptor碼只比LT碼增加了一點復雜度,但是在傳輸開銷和計算上都顯著的提高了它們的效率。
在我們總結(jié)之前有一個進一步的思考問題。對于系統(tǒng)來說噴泉碼可能看起來很理想,比如說比特流,它允許種子生成和散布幾乎無限制數(shù)量的碼塊,或多或少的消除了稀疏種子流“最后一塊”的問題,而且確保兩個隨機選擇的并行端幾乎總有有用信息相互交換。但是它面臨一個重大的問題:驗證從并行端接收到的數(shù)據(jù)將會很難。
像比特流這樣的協(xié)議使用安全散列函數(shù),比如說SHA1,和一個可信任中心(最初的上傳者),向所有的并行端發(fā)送一個權(quán)威散列表。每個并行然后可以驗證他們下載的散列塊的文件包,并且和權(quán)威散列進行對比。但是對于噴泉碼,這個是很難的。根本沒有方法在編碼塊上計算SHA1散列,更不要說單獨塊上的散列。我們不能相信我們的并行端計算的結(jié)果,因為它們可以對我們?nèi)鲋e。我們可以等到我們得到全部文件,然后從無效碼塊列表出發(fā),嘗試推斷什么樣的編碼塊是無效的,但這是困難的也是不可靠的,而且信息來的時候可能已經(jīng)為時已晚。一個可供選擇的方法是讓最初發(fā)布者公布一個公共密鑰,并且標注所有的生成塊。然后我們就可以驗證編碼塊了,但代價是:現(xiàn)在只有最初發(fā)布者可以生成有效的編碼塊了,并且我們失去了最初使用噴泉碼的很多好處。似乎我們被困住了。
還有另一種選擇,而且已經(jīng)證明是一個非常聰明的方案,叫做同態(tài)哈希,盡管它有自己的注意事項和缺點。我們將會在下一版的超酷算法中討論。