hash碰撞的概率推导(生日攻击生日问题)
1.关于hash碰撞
哈希碰撞是指,两个不同的输入得到了相同的输出;
hash碰撞不可避免,hash算法是把一个无限输入的集合映射到一个有限的集合里,必然会发生碰撞;
2.碰撞概率的问题描述的其他形式
n个球,(可重复的)随机放入k个桶里,至少有两个球在同一个桶里的概率;
给K个随机值,非负而且小于n,他们中至少有2个相等的概率;
3.碰撞概率的取决因素
hash碰撞的概率取决于两个因素(k, n
同上述)
hash的取值空间 k
hash的计算次数 n
4.hash碰撞概率的数学原型:生日问题
即: 一个班级需要有多少人,才能保证每个同学的生日都不一样?
结果:当一个班级有7人时,至少两人生日相同的概率在5%;
当一个班级有23人时,至少两人生日相同的概率就达到了50%;
当一个班级有50人时,至少两人生日相同的概率就达到了97%;
5.生日问题概率推导
要求一个班级n个人,至少两个人生日相同的概率 Pa
可以先求每个人生日都不同的概率 Pb
进而转换为:一个空的房间里,第一个人进去与其他人不同的概率(1-0);第二个人进入房间与其他人不同的概率(1- 1/365);第三个人进去与其他人不同的概率(1-2/365)… 以此类推,直到最后一个人进入房间与其他人不同的概率(1-n/365)
得:
Pb(n)=(1−0365)⋅(1−1365)⋅(1−2365)⋅⋅⋅(1−n−1365)(1)Pb(n) = (1-\frac{0}{365})\cdot(1-\frac{1}{365})\cdot(1-\frac{2}{365})\cdot\cdot\cdot(1-\frac{n-1}{365})\tag{1} Pb(n)=(1−3650)⋅(1−3651)⋅(1−3652)⋅⋅⋅(1−365n−1)(1)
进而:
Pb(n)=(365−0365)⋅(365−1365)⋅(365−2365)⋅⋅⋅(365−(n−1)365)(2)Pb(n) = (\frac{365-0}{365})\cdot(\frac{365-1}{365})\cdot(\frac{365-2}{365})\cdot\cdot\cdot(\frac{365-(n-1)}{365})\tag{2} Pb(n)=(365365−0)⋅(365365−1)⋅(365365−2)⋅⋅⋅(365365−(n−1))(2)
化简:
Pb(n)=365!365n(365−n)!(3)Pb(n) = \frac{365!}{365^n(365-n)!}\tag{3} Pb(n)=365n(365−n)!365!(3)
故至少两人生日概率相同Pa为:
Pa(n)=1−Pb(n)=1−365!365n(365−n)!(4)Pa(n) = 1-Pb(n) = 1-\frac{365!}{365^n(365-n)!}\tag{4} Pa(n)=1−Pb(n)=1−365n(365−n)!365!(4)
(4)式即为所求的公式,但是这个公式不便于计算,x趋于0时,根据泰勒公式:
limx→0ex=1+x+12x2+16x3+124x4⋅⋅⋅(5)\lim_{x \to 0}e^x = 1+x+\frac{1}{2}x^2+\frac{1}{6}x^3+\frac{1}{24}x^4\cdot\cdot\cdot\tag{5} x→0limex=1+x+21x2+61x3+241x4⋅⋅⋅(5)
近似的有:
ex≈1+x(6)e^x \approx 1+x\tag{6} ex≈1+x(6)
观察(1)式,用(6)式代入得:
Pb(n)≈(e−0365)⋅(e−1365)⋅(e−2365)⋅⋅⋅(e−n−1365)(7)Pb(n) \approx (e^{-\frac{0}{365}})\cdot(e^{-\frac{1}{365}})\cdot(e^{-\frac{2}{365}})\cdot\cdot\cdot(e^{-\frac{n-1}{365}})\tag{7} Pb(n)≈(e−3650)⋅(e−3651)⋅(e−3652)⋅⋅⋅(e−365n−1)(7)
化简:
Pb(n)≈e−n(n−1)2⋅365(8)Pb(n) \approx e^{-\frac{n(n-1)}{2\cdot365}}\tag{8} Pb(n)≈e−2⋅365n(n−1)(8)
故:
Pa(n)≈1−e−n(n−1)2⋅365(9)Pa(n) \approx 1 - e^{-\frac{n(n-1)}{2\cdot365}}\tag{9} Pa(n)≈1−e−2⋅365n(n−1)(9)
6.hash碰撞概率推导
要求给K个随机值,非负而且小于n,他们中至少有2个相等的概率 Pa
由上述推导不难看出:
Pa(k,n)=1−k!kn(k−n)!(10)Pa(k,n) = 1-\frac{k!}{k^n(k-n)!}\tag{10} Pa(k,n)=1−kn(k−n)!k!(10)
且由泰勒展开式,近似得:
Pa(k,n)≈1−e−n(n−1)2⋅k(11)Pa(k,n) \approx 1 - e^{-\frac{n(n-1)}{2\cdot k}}\tag{11} Pa(k,n)≈1−e−2⋅kn(n−1)(11)
7.python作图
在生日概率问题中,k
取365
,做概率 Pa
关于班级人数n的函数图像:
准确表达式图像(4)式 (acc)
近似表达式图像(9)式 (fit)
代码:
import matplotlib.pyplot as plt
import numpy as np
import mathdef f_accurate(k, n):if n <= 0 or k <= 0:return -1if n > k:return 1var1 = 1for i in range(k - (n - 1), k + 1):var1 *= (i / k)return 1 - var1def f_fit(k, n):if n <= 0 or k <= 0:return -1if n > k:return 1var1 = (-1) * n * (n - 1) / (2 * k)var2 = math.pow(math.e, var1)return 1 - var2def f_plot_var_n(k, n):acc = []fit = []for i in range(1, n):acc.append(f_accurate(k, i))fit.append(f_fit(k, i))arr = np.array(range(1, n))acc = np.array(acc)fit = np.array(fit)plt.title("crash rate k = {}".format(k))plt.xlabel("n number")plt.ylabel("p(n) rate")plt.plot(arr, acc, color='blue', label='acc')plt.plot(arr, fit, color='red', label='fit')plt.legend()plt.show()def f_plot_var_k(k, n):acc = []fit = []for i in range(1, k):acc.append(f_accurate(i, n))fit.append(f_fit(i, n))arr = np.array(range(1, k))acc = np.array(acc)fit = np.array(fit)plt.title("crash rate n = {}".format(n))plt.xlabel("k number")plt.ylabel("p(k) rate")plt.plot(arr, acc, color='blue', label='acc')plt.plot(arr, fit, color='red', label='fit')plt.legend()plt.show()if __name__ == '__main__':k_value = 365n_value = 365# k_value = 10000# n_value = 100f_plot_var_n(k_value, n_value)# f_plot_var_k(k_value, n_value)
可以看出近似表达式与准确表达式相差不大;
碰撞概率在n=23时,已经达到了50%,而取值空间为[0,365]
这对hash取值空间长度的取舍有参考意义;
hash碰撞的概率推导(生日攻击生日问题)相关推荐
- ThreadLocal源码阅读四:如何解决hash碰撞的?
背景 推荐阅读ThreadLocal工作过程 推荐阅读ThreadLocal的魔数引发的疑问与思考 什么样的使用场景会出现hash碰撞? 如何解决hash碰撞的? 过程 可能产生hash碰撞的场景 分 ...
- crc32碰撞_hash碰撞的概率和可能性比你直觉中大得多
注:这篇文章源自我10年前写的博客,今天看到有人谈密码安全的,再发一遍和大家讨论下.我发现哪怕10年后,这文章也没过时,很多人还是没拎清 冲突概率和样本空间的关系. 前段时间跟某大牛叽歪的时候,被提到 ...
- 到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?
一 ,到底什么是hash呢? 作者:知乎用户 链接:https://www.zhihu.com/question/26762707/answer/40119521 来源:知乎 著作权归作者所有.商业转 ...
- Java 集合深入理解 (十一) :HashMap之实现原理及hash碰撞
文章目录 前言 哈希表原理 实现示例 HashMap实现原理 全篇注释分析 实现注意事项 默认属性分析 属性分析 构造方法分析 重要的put方法 总结 前言 哈希表(hashMap)又叫散列表 是一种 ...
- HASHMAP解决hash碰撞相关问题
1.封装类作为KEY,都是final类型保证hash值不可更改; 内部已经实现equals和hashcode方法,遵循hashmap内部规范计算准确性,有效减少hash碰撞的几率, 2.如果使用obj ...
- Java中的Hash碰撞是什么?该如何解决?
在Java中,哈希碰撞(Hash Collision)是指不同的输入数据产生了相同的哈希值.哈希函数是将输入映射到固定大小的哈希值的函数,而碰撞指的是两个不同的输入映射到了相同的哈希值. 哈希碰撞可能 ...
- 什么是hash?什么是hash碰撞?怎么处理hash碰撞?
hash碰撞 如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision).既然是把任意长度的字符串变成固定长度的字符串,所以必有一个输出串对应无穷多个输入串,碰撞是必然存在的. ...
- hash和hash碰撞以及解决方案
hash: Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输 ...
- 使用Hash碰撞进行DoS攻击
一.哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储 ...
最新文章
- 再谈Linux修改应用程序获得root权限
- 自动化网络拓扑 包容多设备类型——湖南省高速公路邵怀高速公路建设开发有限公司...
- html左右飘窗高度不一致,飘窗的最佳尺寸,你可知道?不懂的留着吧!
- python基础-分支判断语句(4)
- Android SO逆向1-ARM介绍
- 开发者应警惕的七种糟糕职业规划错误
- 20160821_第三周周报
- designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水
- 【实践驱动开发3-005】TI WL1835MODCOM8 在android的移植 - SDIO and wifi 基础
- spring security oauth2 资源服务器配置
- [转载] python3基础:异常处理及python常见异常类型总结
- Danfo.js专题 - Danfo.js与Dnotebook简介与入门
- 立法者在民权受到侵蚀时忽略了黑匣子算法
- ubuntu中安装pdf虚拟打印机
- 如何选择合适的地图注记手段
- [haoi2009]毛毛虫 树形dp
- Python计算中国GDP在那一年超越美国GDP(假设)
- TP-LINK三层网管交换机通过console接口完成复位操作
- 计算机毕业设计(附源码)python智慧门诊综合管理系统
- python自学行吗知乎_怎么自学python,大概要多久?