crc32哈希默认/无效值?

时间:2018-04-09 17:48:58

标签: c++ c crc32

我正在构建一个简单的字符串ID系统,使用crc32从我的字符串生成32位整数句柄。我希望默认情况下将StringID包装类中的哈希默认为无效索引,是否存在crc32永远不会生成的值?我是否必须使用单独的标志?

澄清:我对语言特定答案不感兴趣。 我只想知道crc32范围之外是否有一个可用于表示未散列值的整数

谢谢!

3 个答案:

答案 0 :(得分:1)

  

是否存在crc32永远不会生成的值?

不,它将生成32位整数范围内的任何/所有值。

  

我是否必须使用单独的标志?

不一定。

如果您认为(例如)0x00000000表示" CRC未设置"非零是CRC值;然后在计算CRC之后(但在存储它或检查存储的值之前),你可以if(CRCvalue == 0) CRCvalue = 0xFFFFFFFF;

这会将CRC削弱极少量。具体而言,对于2个随机数据,对于纯CRC32,在CRC的4294967296中有1个机会匹配,并且" 0表示未设置"在匹配的CRC的4294967295.000000000232830643654中有1次机会。

答案 1 :(得分:0)

没有。 CRC-32可以是任何 32位值。您需要在其他地方指出无效索引。

我的spoof code允许您选择要修改的消息中的位位置和所需的CRC,并将解决哪些位置要翻转以获得该CRC。

答案 2 :(得分:0)

有一个简单的证明,你可以生成任何crc32值,因为它是galois字段中的de division mod P(其中P是生成多项式)(恰好是一个字段,如实数或复数数字是),你可以减去(这是一个XOR运算,所以加法和减法确实是相同的事情)你的多项式它的模数,给出0余数,然后你可以添加到这个模数的倍数任何可能的crc32给它的值(因为它们已经是分区的剩余部分,它们的crc32就是它们自己)来获得2 ^ 32个可能值中的任何一个。

通常的做法是根据需要添加尽可能多的零位来完成一个完整的32位字(这显示为乘以常数值x^32),然后将余数减去(xor) ,使结果成为模数的倍数(记住加法和减法是相同的 - 一个xor运算),因此制作crc32(pol) = 0x0000;

编辑(更容易看到)

实际上,crc32的每个可能的2 ^ 32值除以生成多项式时,给出了它们自己的结果(它们与生成多项式相互作用,当算术模N为数时,数字1 ... N.整数)所以它们都是crc32()运算符的可能结果

在很多地方实现的crc操作并不那么简单......因为有些实现将余数寄存器初始化为0xffffffff并在终止时查找0xffffffff(实际上,crc32执行此操作) ....如果你做数学运算,你会猜到原因:将寄存器初始化为0x11111111相当于在较长的字符串中有前一个0xffffffff的余数......并在最后查找0xffffffff就像将0xffffffff附加到原始字符串一样。这具有在字符串之前和之后连接位字符串0xffffffff的效果,使得剩余部分在 crc32计算字符串之前和之后附加一串零是合理的(更改字符串通过在任一侧附加零来实现位。无论如何,这种修改并没有改变计算多项式余数的原始算法,因此在这种情况下任何2**32值都是可能的。