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

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

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

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

取1个整型值作为初始值,然后递增1000W次,每次计算crc32的值,输出到文件,再使用sort crc32.result | uniq -c -d > crc32-collision.txt 来输出冲突的结果

结果出来,我大吃一惊:1000W没有1个冲突!大大出乎意料,于是尝试2000W,还是没有冲突!! 于是尝试 1亿,这回有冲突了,冲突数大约是240W个!!

虽然我没有看懂crc32算法的原理,但隐约觉得这个冲突率不符合实际,于是继续寻找,终于功夫不负有心人,找到一个详细和完整的测试报告(http://www.backplane.com/matt/crc64.html):

CRC16 - CRC64 test results on 18.2M dataset

结果摘要如下:

Summary, 18.2 million sample test dataset, number of collisions.output.16 Count 18134464/18200000
output.17 Count 18068928/18200000
output.18 Count 17937856/18200000
output.19 Count 17675712/18200000
output.20 Count 17151424/18200000
output.21 Count 16103198/18200000
output.22 Count 14061250/18200000
output.23 Count 10770169/18200000
output.24 Count 7092360/18200000
output.25 Count 4153742/18200000
output.26 Count 2259269/18200000
output.27 Count 1179721/18200000
output.28 Count 603421/18200000
output.29 Count 305089/18200000
output.30 Count 153722/18200000
output.31 Count 77254/18200000
output.32 Count 38638/18200000
output.33 Count 19232/18200000
output.34 Count 9652/18200000
output.35 Count 4914/18200000
output.36 Count 2343/18200000
output.37 Count 1204/18200000
output.38 Count 637/18200000
output.39 Count 302/18200000
output.40 Count 152/18200000
output.41 Count 75/18200000
output.42 Count 52/18200000
output.43 Count 21/18200000
output.44 Count 13/18200000
output.45 Count 7/18200000
output.46 Count 1/18200000      (below noise floor)
output.47 Count 1/18200000      (below noise floor)
output.48 Count 1/18200000      (below noise floor)
output.49 Count 0/18200000      (below noise floor)
output.50 Count 0/18200000      (... all remaining entries below noise
output.51 Count 0/18200000      floor)
output.52 Count 0/18200000
output.53 Count 0/18200000
output.54 Count 0/18200000
output.55 Count 0/18200000
output.56 Count 0/18200000
output.57 Count 0/18200000
output.58 Count 0/18200000
output.59 Count 0/18200000
output.60 Count 0/18200000
output.61 Count 0/18200000
output.62 Count 0/18200000
output.63 Count 0/18200000
output.64 Count 0/18200000

这个测试报告非常详细,基本上解决了我们的疑问,从这个报告可以看到,1820W数据,冲突数量是38638个,这个比较符合我的理解和预期。

但问题还是没有解决:为什么我的测试结果那么好?

由于CRC32算法是通用的,因此也就不存在不同语言实现机制不同的问题,于是我把目光转向了测试模型,问题果然在这里。

我的测试模型:crc32(i++),这个计算模型输入进去的原值只是某个范围内连续的数据,并不是完全随机的.

于是我稍微修改一下:crc32(md5(i++)),这样就保证输入的原值是完全随机的。

重新测试,结果出来了,和上面那个完整测试报告的结果完全一样!!

归纳总结一下:

1)CRC32在完全随机的输入情况下,冲突概率还是比较高的,特别是到了1亿的数据量后,冲突概率会更高

2)CRC32在输入某个连续段的数据情况下,冲突概率反而很低,这是因为两个冲突的原值理论上应该是相隔很远,只输入某段数据的情况下,这个段里面冲突的原值会很少

转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/42775039

CRC32算法冲突概率测试和分析相关推荐

  1. Hash算法冲突解决方法分析

    就不自己写了,直接贴下吧 看了ConcurrentHashMap的实现, 使用的是拉链法. 虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道 ...

  2. crackme算法分析---CRC32算法的妙用

    loveasm的crackme算法分析-----CRC32算法的妙用 [作者]:onlyu[FCG][DFCG] [软件介绍]:loveasm[YCG][DFCG]兄弟的crackme,主要锻炼算法分 ...

  3. 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)

    图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现) 本文实验为自己原创,转载请注明出处. 本人为研究生,最近的研究方向是物体识别.所以就将常用的几种特 ...

  4. SURF算法与源码分析、下

    FROM: http://www.cnblogs.com/ronny/p/4048213.html 上一篇文章 SURF算法与源码分析.上 中主要分析的是SURF特征点定位的算法原理与相关OpenCV ...

  5. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  6. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  7. c语言将十进制转化为二进制算法_base64算法初探即逆向分析

    算法分析 虽说base64严格意义上来说并不能算是加密算法,但的确应用方面来说还算是比较广,在CTF的算法逆向中Base系列算是也比较常见的,萌新刚开始学算法,就以base64为例,对该算法进行一个简 ...

  8. 数据结构与算法--代码鲁棒性案例分析

    代码鲁棒性 鲁棒是robust的音译,就是健壮性.指程序能够判断输入是否符合规范,对不合要求的输入能够给出合理的结果. 容错性是鲁棒的一个重要体现.不鲁棒的代码发生异常的时候,会出现不可预测的异常,或 ...

  9. 数据结构与算法--代码完整性案例分析

    确保代码完整性 在撸业务代码时候,经常面对的是接口的设计,在设计之初,我们必然要先想好入参,之后自然会有参数的校验过程,此时我们需要把可能的输入都想清楚,从而避免在程序中出现各种纰漏.但是难免面面俱到 ...

最新文章

  1. linux启动tomcat不停的触发gc,tomcat的rmi触发的full gc的时间过长的优化
  2. 每日一皮:有一天某程序员去买肉,要了一公斤...
  3. 手机录音失真_“手机都能录音,还要啥录音笔”,四点原因让说这话的人啪啪打脸...
  4. 《Ext JS权威指南》印出来了,大家很快就能拿到书了
  5. 线下沙龙 | 小身材大能量!用英伟达智能小车Jetbot玩转深度学习
  6. weblogic10数据源(连接池)配置
  7. c语言中 文件的字符串输入函数是6,【C语言】文件操作及输入输出格式(文件常用的库函数)...
  8. C++ 之父讨厌比特币
  9. TextView滚动功能的实现
  10. C#中如何生成矢量图
  11. jQuery源码阅读
  12. 正点原子STM32F103学习笔记(一)
  13. 计算log以二为底的x用计算机,计算器上怎么按出log以2为底的数
  14. net configuration assistant 没反应_苗阜深夜发文:20年了没被打过,张玉浩,你已经离开青曲社了...
  15. Gson解析新浪微博数据
  16. 记一篇IT培训日记061-班活动
  17. 超级服务器防熊系统教程,关于服务器防熊办法
  18. HTTP的详细请求过程
  19. 32位ARM核单片机XL32F003开发板可替代STM32、华大、GD,脚位兼容
  20. H323协议和polycom,华为视频会议终端调试出现的问题

热门文章

  1. 最优化原理与方法之(一)开篇
  2. 豆瓣FM-wordpress
  3. python开源web项目-Python开源项目Top30
  4. PX4模块设计之四:MAVLink简介
  5. 台式机计算机硬件检测,台式电脑常见硬件故障检查和排除怎么做?
  6. ushort mysql,Mysql的CodeFirst:不支持ushort、uint、ulong的字段提示不足
  7. 系统安全性和保密性设计
  8. Axhub service文件分享
  9. 强制删除kubernetes的ns
  10. 正弦波逆变器c语言程序源码,官方开源-EG8010单相纯正弦波逆变器驱动板资料分享...