博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法基础课八:哈希算法
阅读量:3730 次
发布时间:2019-05-22

本文共 1602 字,大约阅读时间需要 5 分钟。

哈希算法

  1. 将任意长度的二进制值串,映射为固定长度的二进制值串,这个映射的规则就是哈希算法,映射的值就是哈希值;
从哈希值不能反向推导出原始数据	原始数据只修改了一个 Bit,新得到哈希值与原哈希值也应该大不相同	散列冲突的概率要很小,即不同的原始数据,映射得到的哈希值相同的概率要非常小	哈希算法的执行效率要尽量高效,要快速地计算出哈希值	举例:		MD5("我今天讲哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb		MD5("我今天讲哈希算法")   = a1fb91ac128e6aa37fe42c663971ac3d		// 哈希值长度一致,原始数据相差小,哈希值完全不同		MD5(一篇4000字文章),也能很快得到哈希值
  1. 应用场景:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储;

安全加密

  1. 常用的加密算法,MD5,SHA,DES,AES,加密要求哈希算法,不能反推原始数据的要求比较高,并且哈希冲突也得尽量小;
哈希值长度越大,哈希冲突的概率越小,但可能加密时间越长,需要做一个平衡

唯一标识

  1. 图片搜索中,不能依靠图片名称搜索,原始的方案是,用图片的二进制码串和图库的所有图片码串进行一一对比,但码串可能非常大,比对效率很低;

  2. 为此,可以给每个图片生成一个信息摘要,即唯一标识,如将图片码串,取前100字节,中间100字节,尾部100字节,然后通过哈希算法,生成一个哈希串,作为唯一标识,图片搜索时,先比对唯一标识,只有当唯一标识匹配时,再进行全量比对来确认是否完全一致;

为加快搜索效率,可以将图片唯一标识,和图片在图库路径,存放在散列表中,这样查找效率高

数据校验

  1. 因为哈希算法,原始数据发生一丁点改变,最终生成的哈希值就大不相同,因此哈希值就可以用来数据校验,保证原始数据发生了改变,校验就会不通过;

散列函数

  1. 散列函数,就是哈希算法,不过它对哈希冲突的要求没有那么高,更关注的是散列是否均匀,散列函数的计算是否高效;

负载均衡

  1. 如果负载均衡策略是会话粘滞,就可以通过哈希算法,对客户端 IP 地址或者会话 ID 计算哈希值,将哈希值与服务器列表的大小进行取模运算,得到的值就是应该被路由到的服务器编号;

  2. 这种方案,比起维护一张 ip 地址和服务器地址的列表,进行查找更方便,尤其在面临服务器上下线的场景;

数据分片

  1. 当面对海量数据,需要并发处理时,可以先对数据进行分片,但要保证分片的关键字,在单机上处理的结果累加,就是整体处理的结果;
如 1 亿张图片,将其哈希值和路径,存放在散列表,单台机器内存不够,需要进行分片,可以根据哈希值对机器个数求模取		余,表示要存放的机器

分布式存储

  1. 当数据进行分布式存储后,节点扩缩容,都涉及数据的搬移,如果单纯的哈希取余,节点上线,会有大量数据需要重新映射,为此引入一致性哈希,是指将数据的最小哈希值和最大哈希值,划分为多个小区间,每个节点维护一部分区间,这样节点上下线,数据映射不会大量改变;

  2. 一致性哈希,借助虚拟环和虚拟节点,

 

应用

  1. 用户密码的存储,可以通过哈希算法 SHA 进行加密后存储,不过如果是简单密码,生成的哈希值,很容易被猜到,因此,可以在用户密码的基础上,加盐后进行 SHA 加密;

  2. 分块 ( 索引 ) 查找,要求块间是有序的,即一个块中的元素,都要比另一个块中元素,大或者小,首先将每个块中最大值,和对应的起始位置,组成一个有序序列,然后通过二分查找,确定元素所在的块,最后在块内,进行顺序查找;

  3. 排序二叉树,查找元素,时间复杂度 O(h),h 是树的最大高度,对于平衡二叉树,h = log2N,查找过程,从根元素开始,每次确定左边,或者右边,进行查找;

  4. 哈希表,查找元素,时间复杂度,O(1),因为元素的存储位置,和元素值直接相关;

算法操作

  1. word 实现

转载地址:http://qsfin.baihongyu.com/

你可能感兴趣的文章
quartz之动态定时器实现
查看>>
springcloud简介
查看>>
eureka集群
查看>>
Ribbon负载均衡及Feign消费者调用服务
查看>>
熔断器Hystrix及服务监控Dashboard
查看>>
Hystrix集群及集群监控turbine
查看>>
Zuul路由网关
查看>>
docker安装及命令
查看>>
docker数据卷
查看>>
docker-dockerfile
查看>>
自定义镜像上传阿里云
查看>>
RabbitMQ入门
查看>>
RabbitMQ消息模式1
查看>>
RabbitMQ消息模式2
查看>>
RabbitMQ整合 SpringCloud
查看>>
通用分页2
查看>>
自定义MVC上
查看>>
easyui高级控件02前后端分离
查看>>
maven环境搭建
查看>>
Python数据可视化之散点图(基础篇---图文并茂详细版!!!)
查看>>