我见过8位,16位和32位CRC.
在什么时候我需要跳到更宽的CRC?
我的直觉反应是它基于数据长度:
编辑:查看有关CRC和洛特答案的维基百科页面,这里有'我们所拥有的:
<64字节:8位CRC
<16K字节:16位CRC
<512M字节:32位CRC
S.L*_*ott 32
这不是一个研究课题.它真的很好理解:http://en.wikipedia.org/wiki/Cyclic_redundancy_check
数学很简单.8位CRC将所有消息分解为256个值中的一个.如果您的消息长度超过几个字节,则具有相同散列值的多个消息的可能性会越来越高.
类似地,16位CRC为您提供65,536个可用哈希值中的一个.具有这些值之一的任何两条消息的几率是多少?
32位CRC为您提供大约40亿个可用的哈希值.
来自维基百科文章:"最大总块长度等于2**r ? 1".这是有点的.您不需要做太多研究就可以看到这2**9 - 1是511位.使用CRC-8,多于64字节的多条消息将具有相同的CRC校验和值.
小智 6
CRC的有效性取决于多种因素.您不仅需要选择CRC的SIZE,还需要选择GENERATING POLYNOMIAL.根据以下因素进行复杂且非直观的权衡取舍:
Philip Chopman和Tridib Chakravarty在2004年可靠系统和网络国际会议的会议记录中公布的"循环冗余码多项式选择嵌入式网络"一文给出了非常好的概述并提出了几点建议.它还提供了一个参考书目,以便进一步理解.
http://www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf
CRC 长度与文件大小的选择主要与以下情况相关:一个输入与“正确”输入的差异比“正确”输入相差三个或更少位的可能性,而不是一个完全不同的输入。给定两个非常不同的输入,错误匹配的可能性对于大多数形式的 8 位校验值(包括 CRC)约为 1/256,对于大多数形式的 16 位校验值(包括 CRC)约为 1/65536等。CRC 的优势来自于它对非常相似的输入的处理。
对于多项式生成两个长度为 128 的周期的 8 位 CRC,在比未检测到的数据包短的数据包中,单、双或三比特错误的比例不会是 1/256——它将为零。与周期为 32768 的 16 位 CRC 类似,使用 32768 位或更少的数据包。
但是,如果数据包长于 CRC 周期,则如果错误位之间的距离是 CRC 周期的倍数,则双位错误将无法检测到。虽然这看起来不太可能发生,但 CRC8 在捕获长数据包中的双位错误方面比在捕获“数据包完全加扰”错误方面要差一些。如果双位错误是第二种最常见的故障模式(在单位错误之后),那就很糟糕了。然而,如果任何破坏某些数据的东西都可能破坏其中的大部分数据,那么具有双位错误的 CRC 的低劣行为可能不是问题。