CRC32 哈希默认值/无效值?



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

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

谢谢!

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

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

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

不一定。

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

这削弱了CRC的极小量。具体来说,对于 2 条随机数据,对于纯 CRC32,4294967296 CRC 匹配的机会为 1 次,在"零表示未设置"的情况下,CRC 匹配的 4294967295.0000000000232830643654 有 1 次机会。

有一个简单的证明,你可以生成任何crc32值,因为它是除法mod P(其中P是生成器多项式)在伽罗瓦场(恰好是一个场,如实数或复数),你可以减去(这是一个XOR运算,所以加减确实是一回事)到你的多项式它的模, 给出一个 0 余数,那么您可以将所有可能的 CRC32 值中的任何一个添加到模数的这个倍数中(因为它们已经是除法的余数,它们的 CRC32 只是它们自己)以获得任何 2^32 个可能的值。

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

编辑(更容易看到)

事实上,crc32 的每个可能的 2^32 值,当除以生成器多项式时,都会给出结果(它们与生成器多项式互质,数字 1 也是如此。N在整数上做算术模N时),所以它们都是crc32()运算符的可能结果。

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

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

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

最新更新