从哈希表到MD5摘要算法
1. 散列表是什么?
定义,摘选自维基百科。
散列表(Hash Table)也叫哈希表。
是根据键(Key)而直接访问在内存存储位置的数据结构
它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
2. 一个例子
通过一个简单的例子解释一下。
老师统计班上同学的成绩,想要把每个分数的人数统计一下,也就是说考了100分的有多少人?考了99分的有多少人?
可能刚接触编程的人会这样写
var score = [...] // 存放了所有学生的成绩
for (var i = 0; i <= 100; i++) {var sum = 0; // 计算考了i分的同学有多少个for (var j = 0; j < score.length; j++) {if (i == score[j]) {sum++}}console.log('考了' + i + '分的同学有' + sum + '人')
}
这样显然很慢。假设统计全校的学生的四六级分数呢,每次的查询都是O(n)
复杂度
那么我们想想其实可以拿分数来当键值,去访问该分数段的人数。
var total = 1000 // 学生的人数
var res = new Array(total).fill(0)
for (var i = 0; i < score.length; i++) {res[score[i]]++
}for (var i = 0; i <= 100; i++) {console.log('考了' + i + '分的同学有' + res[i]+ '人')
}
这就是一个简单的哈希表。
这个散列函数,很简单
Hash(k) = k
,简单的将分数这个关键字当成key值(直接定址法)
这个记录的数组就叫做哈希表。
可以发现,我们的哈希表,
正常情况下修改,查找和删除的复杂度都是O(1),是很优秀的数据结构
2. 哈希冲突
散列表需要一一对应,也就是说,一个键应该对应一个值
如果一个键对应了多个值,那么就会出现冲突,这种冲突叫哈希冲突
那么解决比较好的方法就是拉链法
。
假设score[100]
这个位置出现了a, b
,那就可以将对应值搞成一个链表
a的next域指向b
3. 摘要算法
摘要算法是个啥?听起来很吓唬人,其实它就是一个哈希函数。
3.1 消息摘要
将长度不固定的消息message作为输入参数,运行特定的Hash函数,生成固定长度的输出,这个输出就是Hash,也称为这个消息的消息摘要(Message Digest)
3.2 Hash函数
这个特定的Hash函数,常见的就是MD5
和SHA1
MD5
哈希函数将任意长度的数据摘要(映射)为一个定长的密文
为什么叫摘要而不叫加密呢?因为这个摘要的结果是不可逆的,不能被还原
3.3 安全隐患(碰撞)
理论上来说,不管使用什么样的摘要算法,必然存在2个不同的消息,对应同样的摘要。
因为输入是一个无穷集合,而输出是一个有限集合,所以从数学上来说,必然存在多对一的关系
简单说,也就是如果有一个A 对应 B,因为B是固定的,我一定能再找到一个C也对应B
这只是理论上的,安全的Hash算法几乎是无法破解的。
3.4 用处
数据完整性验证
假设一个软件QQ,开发人员开发完成后
- 对QQ这个软件通过MD5哈希函数得到一个MD5的值,将这个MD5值公布出去
- 用户下载这个软件,如果别人修改了这个QQ软件中的任何内容,或者软件下载途中缺少了某些内容,那么下载完成后,我们对这个文件重新计算MD5的时候,就会发现与QQ官方公布的MD5值不同,这个时候我们就知道我们拿到的QQ数据不完整了。
保护用户密码
原理也是一样的。
假设数据库里存储的用户密码都是明文,如果有坏人攻破了数据库,就轻松拿到了用户密码等信息
那我们就可以通过MD5来保护用户密码
数据库中不存储用户的密码,转而存储用户密码经过MD5计算后的MD5值
用户登录的时候,只要将密码进行MD5计算,与数据库中的MD5值比对,相同即可登录
这样一来,即使数据库密码泄露,坏人也只能拿到计算过后的MD5值,并不能反向推导出用户密码
从哈希表到MD5摘要算法相关推荐
- Hash+哈希表+HashMap+HashSet
Hash+哈希表+HashMap+HashSet 哈希算法,是一类「算法」. 哈希表(Hash Table),是一种「数据结构」. 哈希函数,是支撑哈希表的一类「函数」. Map是映射/地图的意思,在 ...
- (13)拨云见日,闲聊哈希表
经典数据结构教科书中,"表"是数据结构的一个大家族.其中,有顺序表(数组).单向链表.双向链表.循环链表等等.我们今天聊的不是这些,而是"表"中的异类--哈希表 ...
- 哈希(哈希表与哈希函数)
一.哈希 哈希函数是计算机领域特别是在密码学领域应用最广泛的算法之一,哈希表是数据结构中应用最广泛的结构之一,本博客将为大家介绍哈希函数,介绍哈希表. 1.哈希函数 2.哈希表 3.哈希函数在大数据中 ...
- PHP哈希表碰撞攻击原理
哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本原理 ...
- PHP关联数组和哈希表(hash table) 未指定
PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...
- 纸上谈兵: 哈希表 (hash table)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! HASH 哈希表(hash table)是从一个集合A到另一个集合B的映射(map ...
- 数据结构与算法笔记(十五)—— 散列(哈希表)
一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...
- 哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA 作者:Xuegui Chen 哈希是一种通过对数据 ...
- java取余数的函数_左神算法基础:哈希函数和哈希表
笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...
最新文章
- mysql20数据_mysql 插入20万条数据
- 【Python】Python3中的str和bytes
- 解决margin-top没有效果
- 蓝桥杯 1427 买不到的数目 (模拟)
- 【django】查询集QuerySet
- Lindley equation
- 获取对象属性(key)
- 搜狗高速浏览器打开网页没有声音怎么办
- SAP License:关于工作我的一些体会
- 误删除MySQL数据库表的ibd文件怎么办
- WPF中的相关属性含义
- 41页工业物联网大数据平台建设方案
- 云盒子linux版本,10分钟,搭建好属于自己的私有云盘系统
- SQL练习题——店铺UV、访客信息
- echarts 柱状图让柱子倒叙
- 智慧畜牧养殖系统的感知设备
- 公众号开发完整页面1
- 解析wiki数据(带标点,保留格式)
- 妻子决定你未来事业的高度,男的看一看,女的学一学
- Elasticsearch Java Client创建索引
热门文章
- 阿里大鱼短信功能使用
- 超级强大的SVG SMIL animation动画详解
- veket linux手机版,veket-8.05 使用Linux多少的内核
- 信息收集之外网信息收集
- 前沿笔记|Eva:基于AI强化学习的COVID-19检测判断模型|Nature
- 我们该如何度过自己的大学四年?
- java string数组循环_java数组中String [ ] a={aa,bb,cc};利用for循环进行遍历
- 1、ATK-LORA-01
- LP32,ILP32,LP64,LLP64,ILP64数据模型
- 通达信股票接口委托成功原理是什么?