哈希算法

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 哈希算法

什么是哈希算法

1.定义:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,原始数据通过映射之后得到的值即为二进制串的哈希值。

2.一个优秀的哈希算法应满足什么样的条件?

 1.不能反向推到出元数据(即单向哈希算法)。

 2.对输入数据敏感,即使修改一个bit位,得到的结果也大不同。

 3.散列冲突概率要小,对不同的原始数据,哈希值相同的概率非常小。

 4.执行效率要尽量高,针对较长的串,也能快速计算出哈希值。

3.例如

MD5("今天我来讲哈希算法") = bb4767201ad42c74e650c1b6c03d78fa
MD5("jiajia") = cd611a31ea969b908932d44d126d195b
MD5("我今天讲哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb
MD5("我今天讲哈希算法") = a1fb91ac128e6aa37fe42c663971ac3d

哈希算法的应用

1.安全加密

MD5、SHA、DES、AES

无法做到零冲突,但概率极低。

开发时,权衡破解难度和计算时间来选择合适的算法。

2.唯一标识

搜索相同的文件或者图片时,转换成二进制直接对比的话是比较耗时的。

我们可以通过构造一个唯一标识或信息摘要,进行对比以提高效率。

若要提高效率及准确率,我们可以将图片的唯一标识和路径保存到散列表,当查找时,可以通过哈希算法获取图片的唯一标识,判断其是否在散列表中,若不在,则证明图片不存在;若存在该标识,则获取对应路径的图片进行全量对比。

3.数据校验

比如,迅雷、电驴等下载软件

对下载的数据块分别取哈希值,与种子文件中的值进行比对。

4.散列函数

相对哈希算法,散列函数对冲突的要求低,且不关心是否能反向解密,其只关心数据是否能均分的分布,另外,散列函数一般比较简单,比较追求效率。

5.负载均衡

通过哈希算法对客户端ip或会话id计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。(即实现了一个会话粘滞[session sticky]的负载均衡算法)

其实,最直接的会话粘滞负载均衡的实现方法是,维护一张映射关系表,记录客户端ip或会话id与服务器编号的关系,但其弊端也很明显,1,客户端很多时,比较浪费空间;2.客户端上下线、服务器扩容缩容时需要重新维护,成本高。

负载均衡的算法有很多,比如还可以通过轮询、随机、加权轮询等来实现。

6.数据分片

例1:如何统计“搜索关键词”的出现次数(1T日志文件,记录了用户搜索关键词,如何快速统计词频)

 先对数据进行分片,然后采用多台机器进行处理来提高速度。

 从日志文件中,依次读取每个搜索关键词,并且通过哈希算法计算哈希值,与机器数量n求模即该分配到的机器编号,最终,同一个词都会被分配到同一个机器上,最终,把所有机器的结果合并即可。

这个过程也是MapReduce的基本设计思想。

例2:如何快速判断图片是否在图库中?

和唯一标识时不同的是,若这里的图片库数量很大,单机是不可能完成的。

我们同样可以对数据进行分片,采用多机处理,准备n台机器,让每台机器维护某一部分图片的散列表,当判断时,通过同样的哈希算法,计算图片的唯一标识,与机器个数n取模得到k,则去编号为k的机器上的散列表中查找。

在工程中,可以通过估算,来对事先需要投入的资源、资金有个大概的了解,以更好的评估方案可行性。

实际上,针对海量数据的处理问题,我们可以采用多机分布式处理,借助这种分配的思路,可以突破单机内存、CPU等资源的限制。

7.分布式存储

一致性哈希算法(在加入新机器后,并不需要做大量的数据搬移,否则会发生雪崩效应)

 

如何防止数据库信息被脱库

通过哈希算法,对密码进行加密后保存。

但简单的加密并不能解决问题,因为还有字典攻击的问题,针对字典攻击,我们可以引入一个盐(salt)跟用户的密码组合在一起,增加密码的复杂度,我们可以拿组合后的字符串来做哈希算法并存储到数据库。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
59 3
|
24天前
|
算法 安全
散列值使用相同的哈希算法
当使用相同的哈希算法对相同的数据进行散列时,所产生的散列值(也称为哈希值或摘要)总是相同的。这是因为哈希算法是一种确定性的函数,它对于给定的输入将始终产生相同的输出。 例如,如果你用SHA-256算法对字符串"hello world"进行哈希处理,无论何时何地,只要输入是完全一样的字符串,你都会得到相同的160位(40个十六进制字符)的SHA-256散列值。 但是,需要注意的是,即使是输入数据的微小变化也会导致产生的散列值完全不同。此外,不同的哈希算法(如MD5、SHA-1、SHA-256等)会对相同的数据产生不同的散列值。 哈希算法的一个关键特性是它们的“雪崩效应”,即输入中的一点小小
32 4
|
2月前
|
存储 算法 C#
C#哈希查找算法
C#哈希查找算法
|
2月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
51 0
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
4月前
|
算法 安全 JavaScript
安全哈希算法:SHA算法
安全哈希算法:SHA算法
105 1
安全哈希算法:SHA算法
|
4月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
656 1
|
5月前
|
缓存 负载均衡 算法
(四)网络编程之请求分发篇:负载均衡静态调度算法、平滑轮询加权、一致性哈希、最小活跃数算法实践!
先如今所有的技术栈中,只要一谈关于高可用、高并发处理相关的实现,必然会牵扯到集群这个话题,也就是部署多台服务器共同对外提供服务,从而做到提升系统吞吐量,优化系统的整体性能以及稳定性等目的。
|
6月前
|
存储 算法 安全
深入理解SHA系列哈希算法:安全性的保障与演进
深入理解SHA系列哈希算法:安全性的保障与演进
|
6月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
69 1

热门文章

最新文章