传说程序圈有个老哥可以口算md5, 虽然不知道真假, 但是我们终于可以说, 不就是摘要算法么, 我也能口算!
原来真的有一种特殊的摘要算法简单到摘要值只有1个bit, 那就是: 奇偶校验编码.
我们都知道摘要(digest)算法是一种信息有损的算法, 用于对源数据进行抽象的描述, 输出值(消息)通常是固定长度的, 例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出,SHA-1的变体可以产生192比特位和256比特位的消息摘要。一般认为,摘要的最终输出越长,该摘要算法就越安全。
于是, 又因为数学理论告诉我们, 任何长度>=0都是合理的, 那么当消息的长度等于1会诞生出什么样的算法呢? 于是数学家们就兴冲冲的去研究length===1的摘要算法了, 结果还真设计出来一个有用的东西: 奇偶校验摘要.
由于1bit的消息表示能力非常有限, 那么如何完美的利用这1bit的信息呢? 最容易想到的就是, 1bit可以表示原数据中"1"(或"0")的个数的奇偶性, 这也就是奇偶校验的核心算法...
卵用在何处?
hash算法可以验证大量数据的完整性, 因为2个不同数据生成相同的hash值的概率可以忽略, 但是如果hash值只有1bit的话, 概率就是50%了, 根本防不住数据破坏攻击...
可以防住一些超罕见的自然灾害
比如宇宙射线, 狂甩机械盘等操作, 有可能将某一个bit正负颠倒, 这时候通过奇偶校验就可以检测出来, 但是如果偶数个bit同时出错就无解了, 这也是1bit奇偶摘要的局限性, 但1bit成本超低的特点加上2个比特同时出错的概率太小太小, 奇偶校验得到了广泛应用, 无论是你的内存还是外存, 通过一个异或门实现.
How It Works
奇偶校验可描述为:给每一个码字加一个校验位,用它来构成奇性或偶性校验。可以看出,附加码元d2,是简单地用来使每个字成为偶性的。因此,若有一个码元是错的,就可以分辨得出,因为奇偶校验将成为奇性。奇偶校验编码通过增加一位校验位来使编码中1个个数为奇数(奇校验)或者为偶数(偶校验),从而使码距变为2。因为其利用的是编码中1的个数的奇偶性作为依据,所以不能发现偶数位错误。
所以奇偶校验算法只能查错, 并不能纠错(定位错误)
注: 我在<计算机组成原理>上发现了这个算法, 为了记住它我才使劲思考, 最终将它归纳进摘要算法大家族, 这完全是我自己定义的, 并么有官方承认, 但自认为并没有定义错误(哈哈)

实现
具体实现上,肯定不能计算数据中1的个数,然后除以2取模来判断奇偶性,因为这样会浪费资源,最高效的算法是通过异或门来实现,比如图中3个bit之间xor运算得到输出值Y,输人的“1”为偶数个时,输出Y=0。

1万+



被折叠的 条评论
为什么被折叠?



