数据长度与CRC长度

时间:2010-02-23 21:02:04

标签: crc crc32

我见过8位,16位和32位CRC。

我需要在什么时候跳转到更宽的CRC?

我的直觉反应是它基于数据长度:

  1. 1-100字节:8位CRC
  2. 101 - 1000字节:16位CRC
  3. 1001 - ???字节:32位CRC
  4. 编辑: 查看有关CRC和Lott答案的维基百科页面,这里有“我们拥有的内容:

    < 64字节:8位CRC

    < 16K字节:16位CRC

    < 512M字节:32位CRC

6 个答案:

答案 0 :(得分:31)

这不是一个研究课题。它真的很清楚: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校验和值。

答案 1 :(得分:6)

CRC的有效性取决于多种因素。您不仅需要选择CRC的SIZE,还需要选择GENERATING POLYNOMIAL。根据以下内容进行复杂且非直观的权衡:

  • 频道的预期误码率。
  • 错误是倾向于以突发形式发生还是倾向于分散(突发是常见的)
  • 要保护的数据长度 - 最大长度,最小长度和分布。

由Philip Koopman和Tridib Chakravarty撰写的“循环冗余码多项式选择嵌入式网络”在2004年可靠系统和网络国际会议的会议记录中公布了一个非常好的概述,并提出了一些建议。它还提供了一个参考书目,以便进一步理解。

http://www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf

答案 2 :(得分:3)

CRC长度与文件大小的选择主要与以下情况有关:一个人的输入更可能与"正确"输入三个或更少的位而不是一个大不同的位。鉴于两个输入大不相同,错误匹配的可能性约为1/256,大多数形式的8位校验值(包括CRC),1/65536,大多数形式的16位校验值(包括CRC) CRC的优势来自于对输入的处理非常相似。

对于8位CRC,其多项式生成两个长度为128的周期,数据包中单个,双重或三重比特错误的分数比未检测到的少,不会是1/256 - 它将为零。同样,对于周期为32768的16位CRC,使用32768位或更少的数据包。

然而,如果分组长于CRC周期,则如果错误比特之间的距离是CRC周期的倍数,则将不检测到双比特错误。虽然这可能看起来不是一个非常可能的情况,但是CRC8在捕获长数据包中的双比特错误方面比在捕获数据包时要差一些。数据包被完全打乱"错误。如果双位错误是第二种最常见的故障模式(在单位错误之后),那将是不好的。但是,如果任何破坏某些数据的内容可能会破坏其中的大部分数据,那么具有双位错误的CRC的劣质行为可能不是问题。

答案 3 :(得分:2)

我认为CRC的大小更多地与您需要的CRC的唯一性有关,而不是与输入数据的大小有关。这与您计算CRC的特定用途和项目数有关。

答案 4 :(得分:2)

应根据消息的长度专门选择CRC,这不仅仅是CRC大小的问题: http://www.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf

答案 5 :(得分:2)

这是对CRC-N的一个很好的“现实世界”评估 http://www.backplane.com/matt/crc64.html

我使用CRC-32和文件大小比较,并且在所检查的数十亿个文件中,永远不会遇到匹配的CRC-32和文件大小冲突。但我知道有一些存在,而不是故意被迫存在。 (黑客技巧/利用)

进行比较时,您还应检查“数据大小”。在正确的大小范围内,您很少会遇到具有匹配CRC的相同数据大小的冲突。

通常通过添加额外数据来完成操作数据,伪造匹配,直到CRC与目标匹配。但是,这会导致数据大小不再匹配。尝试使用相同精确大小的暴力或循环通过随机或顺序数据会留下真正的窄碰撞率。

您还可以在数据大小内进行冲突,只需使用所使用的公式的通用限制,以及使用位/字节和基数十制的约束,这取决于浮点值,它们会被截断和剪切

当你开始看到许多不能被“确认”为“原件”的碰撞时,你想要考虑更大的一点。 (当它们都具有相同的数据大小时,(当向后测试时,它们具有匹配的CRC。反向/字节或反向/位或位偏移)

无论如何,它绝不应仅用作比较的唯一形式,仅用于快速形式的比较,用于索引。

您可以使用CRC-8索引整个互联网,并将所有内容划分为N-catagories之一。你想要那些碰撞。现在,对于那些预先排序的,你只需要检查一个N目录,寻找“文件大小”,或“反向CRC”,或者你可以快速地对那个较小的数据集进行的任何其他比较。 ..

在同一blob数据上向前和向后执行CRC-32比在一个方向上使用CRC-64更可靠。 (或者MD5,就此而言。)