CRC 校验和的分配

Distribution of CRC checksums

我正在研究 CRC 校验和用作散列时的冲突概率。我知道如何计算均匀分布的哈希算法的碰撞概率(这意味着获得随机输入数据的所有可能校验和的机会是相同的)。

我不知道的(我在网上找不到):

  1. CRC 校验和通常[不]均匀分布吗?
  2. 分布是否取决于多项式?
  3. 分布是否取决于输入数据大小?

P.S.: 我知道使用 CRC 作为散列时的限制,所以这不是这个问题的一部分。

除了恶意(您可以通过更改消息中的位来强制执行您喜欢的任何 CRC)之外,CRC 均匀分布在所有值上。多项式无所谓,只要是有效的CRC多项式即可,输入只需为CRC的大小或更大即可。

我也很好奇这个,所以我在Linux上使用crc32命令做了一些测试:

# I am printing each number several times so the data is longer than 32-bits:
$ for N in {000001..999999}; do echo -n $N$N$N$N | crc32 /dev/stdin; done >crcs


# There are no complete (8-character) collisions:
$ cat crcs | sort | uniq -d | wc -l
0

# There are no 7-character collisions:
$ for COL in 1 2; do cat crcs | awk "{print substr($1,$COL,7)}" | sort | uniq -d; done | wc -l
0

# There are exactly 32k 6-character collisions:
$ for COL in 1 2 3; do cat crcs | awk "{print substr($1,$COL,6)}" | sort | uniq -d; done | wc -l
32768


# Also, the distribution of the letters in each column is *extremely* uniform.
# Each column has results similar to these:
$ cat crcs | awk '{print substr(,1,1)}' | sort | uniq -c
  62440 0
  62439 1
  62440 2
  62440 3
  62560 4
  62560 5
  62560 6
  62560 7
  62560 8
  62560 9
  62560 a
  62560 b
  62440 c
  62440 d
  62440 e
  62440 f

...所以我的结论是 CRC32 在均匀分布校验和方面做得非常好。