CRC32算法冲突概率测试和分析

本文探讨了CRC32算法在不同测试模型下的冲突概率。通过实验发现,当输入数据为连续序列时,CRC32冲突概率较低;而当输入数据为完全随机时,冲突概率显著增加。作者通过改变测试模型,使用crc32(md5(i++)),得到了与已有的详细测试报告一致的结果。
摘要由CSDN通过智能技术生成

最近因为某个业务需要用到CRC32算法,但业务又不能容忍重复的数值出现,于是自然就想了解一下CRC32算法的冲突概率(或者叫碰撞概率)。


本以为这种问题应该很多人分析过,结果找来找去就只看到一大堆数学公式,我这种数学盲完全看不懂。

好不容易找到一张图,但看得云里雾里(原图链接:http://preshing.com/20110504/hash-collision-probabilities/ ):

enter image description here


既然网上的不靠谱,那就自己来验证吧,写个php脚本很简单,我的第1次验证模型是这样的:

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
CRC32是一种循环冗余校验算法,用于检测或纠正数据传输中的错误。 CRC32算法是基于多项式除法的原理。将待校验的数据看做是一个二进制数,然后与生成式进行运算,得到一个余数。这个余数就是校验值,称为CRC码。 CRC32算法对数据进行处理,生成CRC码后,将CRC码附加在原始数据之后一起传输。接收端将接收到的数据再次进行CRC运算,得到的余数如果为零,说明数据是正确的;如果余数不为零,则说明数据在传输过程中发生了错误。 CRC32算法的好处是简单且效率高。它只需进行位运算,不需要乘法和除法操作,因此速度比较快。在校验方面,CRC32算法能够检测大部分错误,但并不能检测所有错误。虽然CRC32算法可能会误判,但误判的概率相对较低。 在Java中,可以通过使用java.util.zip.CRC32类来计算CRC32值。可以通过以下步骤来使用该类: 1. 创建一个CRC32对象。 2. 将要计算CRC32的数据写入到缓冲区中。 3. 调用CRC32对象的update()方法,将缓冲区的数据传递给CRC32对象。 4. 调用CRC32对象的getValue()方法,获取计算得到的CRC32值。 以下是一个简单的例子来计算CRC32值: ```java import java.util.zip.CRC32; public class CRC32Example { public static void main(String[] args) { String data = "Hello, World!"; byte[] buffer = data.getBytes(); CRC32 crc32 = new CRC32(); crc32.update(buffer); long crcValue = crc32.getValue(); System.out.println("CRC32 Value: " + crcValue); } } ``` 上述代码将输出字符串"Hello, World!"的CRC32值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值