不知大家有过硬盘坏道没,反正有一次我是遇上了,珍贵的collection顷刻间化为乌有。信息时代,每个人都面临着一个新的问题:如何储存你的重要文件最为安全?大多数人会选择多弄它几个备份,虽然这种办法的效率和“性价比”都不高。有没有什么高效而又节省空间的办法来保证数据安全呢?最近,ttsiod写了一篇关于Linux小软件Rsbep的文章,里面提到的算法可以保证大段数据丢失以后仍然能复原原来的数据。算法基于一种叫做Reed-Solomon的编码方式。
Reed-Solomon编码的核心思想非常有趣:任意k个点都惟一地确定了一个最高次数为k-1次的多项式,如果我们把要传送的信息用一个多项式函数上的点来表示,那么我们可以用更多的点来描述这一信息,这样即使某些点的位置在传输过程中发生了错误,接收者也能根据其它的点来复原全部信息。考虑一个大小为n的有限域(由于一个字节有2^8=256种可能的值,n通常取256),其元素分别为x_0, x_1, x_2, …, x_n;而我们要传输的数据长度为k。首先我们把这k个字节的数据当作有限域的前k个非0元素所对应的函数值,确定出它们所对应的k-1次多项式函数f;然后计算出n-1个非0元素的函数值f(x_1), f(x_2), …, f(x_n),作为最终的编码发送出去。注意我们的元素是一个有限域,因此多项式的值仍然在这个域里面(范围仍然是0到255)。在实际应用中,我们通常取k=223,这样的话223个字节的数据将加强为一段255字节长的数据,其中有32个字节是附加的信息。这种编码的纠错能力很强,即使有16个字节在传输中发生错误,我们也能通过剩余的信息复原出原始数据。