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时,根据泰勒公式:
lim⁡x→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→0lim​ex=1+x+21​x2+61​x3+241​x4⋅⋅⋅(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作图

在生日概率问题中,k365,做概率 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碰撞的概率推导(生日攻击生日问题)相关推荐

  1. ThreadLocal源码阅读四:如何解决hash碰撞的?

    背景 推荐阅读ThreadLocal工作过程 推荐阅读ThreadLocal的魔数引发的疑问与思考 什么样的使用场景会出现hash碰撞? 如何解决hash碰撞的? 过程 可能产生hash碰撞的场景 分 ...

  2. crc32碰撞_hash碰撞的概率和可能性比你直觉中大得多

    注:这篇文章源自我10年前写的博客,今天看到有人谈密码安全的,再发一遍和大家讨论下.我发现哪怕10年后,这文章也没过时,很多人还是没拎清 冲突概率和样本空间的关系. 前段时间跟某大牛叽歪的时候,被提到 ...

  3. 到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?

    一 ,到底什么是hash呢? 作者:知乎用户 链接:https://www.zhihu.com/question/26762707/answer/40119521 来源:知乎 著作权归作者所有.商业转 ...

  4. Java 集合深入理解 (十一) :HashMap之实现原理及hash碰撞

    文章目录 前言 哈希表原理 实现示例 HashMap实现原理 全篇注释分析 实现注意事项 默认属性分析 属性分析 构造方法分析 重要的put方法 总结 前言 哈希表(hashMap)又叫散列表 是一种 ...

  5. HASHMAP解决hash碰撞相关问题

    1.封装类作为KEY,都是final类型保证hash值不可更改; 内部已经实现equals和hashcode方法,遵循hashmap内部规范计算准确性,有效减少hash碰撞的几率, 2.如果使用obj ...

  6. Java中的Hash碰撞是什么?该如何解决?

    在Java中,哈希碰撞(Hash Collision)是指不同的输入数据产生了相同的哈希值.哈希函数是将输入映射到固定大小的哈希值的函数,而碰撞指的是两个不同的输入映射到了相同的哈希值. 哈希碰撞可能 ...

  7. 什么是hash?什么是hash碰撞?怎么处理hash碰撞?

    hash碰撞 如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision).既然是把任意长度的字符串变成固定长度的字符串,所以必有一个输出串对应无穷多个输入串,碰撞是必然存在的. ...

  8. hash和hash碰撞以及解决方案

    hash: Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输 ...

  9. 使用Hash碰撞进行DoS攻击

    一.哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储 ...

最新文章

  1. 再谈Linux修改应用程序获得root权限
  2. 自动化网络拓扑 包容多设备类型——湖南省高速公路邵怀高速公路建设开发有限公司...
  3. html左右飘窗高度不一致,飘窗的最佳尺寸,你可知道?不懂的留着吧!
  4. python基础-分支判断语句(4)
  5. Android SO逆向1-ARM介绍
  6. 开发者应警惕的七种糟糕职业规划错误
  7. 20160821_第三周周报
  8. designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水
  9. 【实践驱动开发3-005】TI WL1835MODCOM8 在android的移植 - SDIO and wifi 基础
  10. spring security oauth2 资源服务器配置
  11. [转载] python3基础:异常处理及python常见异常类型总结
  12. Danfo.js专题 - Danfo.js与Dnotebook简介与入门
  13. 立法者在民权受到侵蚀时忽略了黑匣子算法
  14. ubuntu中安装pdf虚拟打印机
  15. 如何选择合适的地图注记手段
  16. [haoi2009]毛毛虫 树形dp
  17. Python计算中国GDP在那一年超越美国GDP(假设)
  18. TP-LINK三层网管交换机通过console接口完成复位操作
  19. 计算机毕业设计(附源码)python智慧门诊综合管理系统
  20. python自学行吗知乎_怎么自学python,大概要多久?

热门文章

  1. 全球及中国核电行业建设动态及项目运营状况分析报告2021-2027年
  2. ECMA为什么不学最新版本
  3. 微信支付之JSAPI支付开发流程
  4. linux c 检测程序是否运行环境,Linux下用C语言判断程序是否已运行
  5. 自学一年Java程序员,能找到月入10K的工作吗?
  6. ARM64下构建 UEFI 模块
  7. Oracle11g本地数据库创建用户和密码,附赠使用PL/SQL软件登录用户
  8. PdfjsAnnotate批注集成富文本编辑器源码
  9. 对企业来说,为什么客户服务尤其重要?
  10. python获取路由器信息_使用python爬取互联网设备信息