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函数,常见的就是MD5SHA1

MD5哈希函数将任意长度的数据摘要(映射)为一个定长的密文

为什么叫摘要而不叫加密呢?因为这个摘要的结果是不可逆的,不能被还原

3.3 安全隐患(碰撞)

理论上来说,不管使用什么样的摘要算法,必然存在2个不同的消息,对应同样的摘要。
因为输入是一个无穷集合,而输出是一个有限集合,所以从数学上来说,必然存在多对一的关系

简单说,也就是如果有一个A 对应 B,因为B是固定的,我一定能再找到一个C也对应B

这只是理论上的,安全的Hash算法几乎是无法破解的。

3.4 用处

数据完整性验证

假设一个软件QQ,开发人员开发完成后

  1. 对QQ这个软件通过MD5哈希函数得到一个MD5的值,将这个MD5值公布出去
  2. 用户下载这个软件,如果别人修改了这个QQ软件中的任何内容,或者软件下载途中缺少了某些内容,那么下载完成后,我们对这个文件重新计算MD5的时候,就会发现与QQ官方公布的MD5值不同,这个时候我们就知道我们拿到的QQ数据不完整了。

保护用户密码
原理也是一样的。

假设数据库里存储的用户密码都是明文,如果有坏人攻破了数据库,就轻松拿到了用户密码等信息

那我们就可以通过MD5来保护用户密码

数据库中不存储用户的密码,转而存储用户密码经过MD5计算后的MD5值

用户登录的时候,只要将密码进行MD5计算,与数据库中的MD5值比对,相同即可登录

这样一来,即使数据库密码泄露,坏人也只能拿到计算过后的MD5值,并不能反向推导出用户密码

从哈希表到MD5摘要算法相关推荐

  1. Hash+哈希表+HashMap+HashSet

    Hash+哈希表+HashMap+HashSet 哈希算法,是一类「算法」. 哈希表(Hash Table),是一种「数据结构」. 哈希函数,是支撑哈希表的一类「函数」. Map是映射/地图的意思,在 ...

  2. (13)拨云见日,闲聊哈希表

    经典数据结构教科书中,"表"是数据结构的一个大家族.其中,有顺序表(数组).单向链表.双向链表.循环链表等等.我们今天聊的不是这些,而是"表"中的异类--哈希表 ...

  3. 哈希(哈希表与哈希函数)

    一.哈希 哈希函数是计算机领域特别是在密码学领域应用最广泛的算法之一,哈希表是数据结构中应用最广泛的结构之一,本博客将为大家介绍哈希函数,介绍哈希表. 1.哈希函数 2.哈希表 3.哈希函数在大数据中 ...

  4. PHP哈希表碰撞攻击原理

    哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本原理 ...

  5. PHP关联数组和哈希表(hash table) 未指定

    PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...

  6. 纸上谈兵: 哈希表 (hash table)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! HASH 哈希表(hash table)是从一个集合A到另一个集合B的映射(map ...

  7. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  8. 哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA 作者:Xuegui Chen 哈希是一种通过对数据 ...

  9. java取余数的函数_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

最新文章

  1. mysql20数据_mysql 插入20万条数据
  2. 【Python】Python3中的str和bytes
  3. 解决margin-top没有效果
  4. 蓝桥杯 1427 买不到的数目 (模拟)
  5. 【django】查询集QuerySet
  6. Lindley equation
  7. 获取对象属性(key)
  8. 搜狗高速浏览器打开网页没有声音怎么办
  9. SAP License:关于工作我的一些体会
  10. 误删除MySQL数据库表的ibd文件怎么办
  11. WPF中的相关属性含义
  12. 41页工业物联网大数据平台建设方案
  13. 云盒子linux版本,10分钟,搭建好属于自己的私有云盘系统
  14. SQL练习题——店铺UV、访客信息
  15. echarts 柱状图让柱子倒叙
  16. 智慧畜牧养殖系统的感知设备
  17. 公众号开发完整页面1
  18. 解析wiki数据(带标点,保留格式)
  19. 妻子决定你未来事业的高度,男的看一看,女的学一学
  20. Elasticsearch Java Client创建索引

热门文章

  1. 阿里大鱼短信功能使用
  2. 超级强大的SVG SMIL animation动画详解
  3. veket linux手机版,veket-8.05 使用Linux多少的内核
  4. 信息收集之外网信息收集
  5. 前沿笔记|Eva:基于AI强化学习的COVID-19检测判断模型|Nature
  6. 我们该如何度过自己的大学四年?
  7. java string数组循环_java数组中String [ ] a={aa,bb,cc};利用for循环进行遍历
  8. 1、ATK-LORA-01
  9. LP32,ILP32,LP64,LLP64,ILP64数据模型
  10. 通达信股票接口委托成功原理是什么?