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

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

本以为这种问题应该很多人分析过,结果找来找去就只看到一大堆数学公式,我这种数学盲完全看不懂。
好不容易找到一张图,但看得云里雾里(原图链接:http://preshing.com/20110504/hash-collision-probabilities/ ):

enter image description here

既然网上的不靠谱,那就自己来验证吧,写个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/18200000output.17 Count 18068928/18200000output.18 Count 17937856/18200000output.19 Count 17675712/18200000output.20 Count 17151424/18200000output.21 Count 16103198/18200000output.22 Count 14061250/18200000output.23 Count 10770169/18200000output.24 Count 7092360/18200000output.25 Count 4153742/18200000output.26 Count 2259269/18200000output.27 Count 1179721/18200000output.28 Count 603421/18200000output.29 Count 305089/18200000output.30 Count 153722/18200000output.31 Count 77254/18200000output.32 Count 38638/18200000output.33 Count 19232/18200000output.34 Count 9652/18200000output.35 Count 4914/18200000output.36 Count 2343/18200000output.37 Count 1204/18200000output.38 Count 637/18200000output.39 Count 302/18200000output.40 Count 152/18200000output.41 Count 75/18200000output.42 Count 52/18200000output.43 Count 21/18200000output.44 Count 13/18200000output.45 Count 7/18200000output.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 noiseoutput.51 Count 0/18200000 floor)output.52 Count 0/18200000output.53 Count 0/18200000output.54 Count 0/18200000output.55 Count 0/18200000output.56 Count 0/18200000output.57 Count 0/18200000output.58 Count 0/18200000output.59 Count 0/18200000output.60 Count 0/18200000output.61 Count 0/18200000output.62 Count 0/18200000output.63 Count 0/18200000output.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容