算法四——哈希

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

哈希算法的定义

文章来自极客时间。
参考网页
定义:将任意长度的二进制值串映射为固定长度的二进制值串。映射之后的二进制值串称为哈希值。
符合几点要求:
 1 从哈希值不能推导出原文。
 2 原文有一个bit的值发生变化,哈希值不相同。
 3 散列冲突的概率要小,对于不同的原文产生相同哈希值的概率要小。
 4 高效,对长文本生成哈希值也要非常快。

哈希算法的常见应用

1 安全加密

最常用于加密的算法有MD5,SHA、DES、AES。
 鸽巢原理。哈希算法只能尽量减少碰撞冲突不能完全避免冲突的理论基础就是鸽巢原理。10个鸽巢,11只鸽子,肯定有2只鸽子在同一个鸽巢内。哈希值的长度是固定的,例如MD5算法哈希值是128位。128位能表示21282^{128}2128个数据。超出范围就会产生冲突。一般情况下,哈希值越长,产生冲突的概率就越低。
 加密算法选择多长的哈希值主要由破解难度和计算时间两方面决定。

2 唯一标识

图片查询
 唯一标识是指用哈希值表示一个长文件。例如图片、文件。如果我们想查找一个图片在我们的图片库中是否存在,我们希望通过比对文件查找。因为图片标题可能和图片内容不匹配。一个图片文件一般10几K,甚至几M,要想直接比较非常耗时。我们可以读取图片文件的开头100个字节,中间100个字节,末尾100个字节,放到一起计算哈希值。查询图片的时候,对于输入的图片也按照同样的方式计算哈希值,然后比较是否有相同哈希值的图片。

3 数据校验

BT下载
 BT下载是基于P2P协议从多台机器上同时下载一个2G的电影。这个文件可能被分割为很多块。等所有块下载完成再组装成一个文件。但是网络传输是不安全的。我们需要在电影文件分割的时候,记录每个文件对应的哈希值,写在种子文件中。当下载完成后,计算下载文件的哈希值和种子文件中的哈希值比对。如果不一致,需要重新下载。

4 散列函数

要求散列函数计算的哈希值能够均匀分布在各个槽。
要求散列函数简单高效。

5 负载均衡

会话粘滞的负载均衡算法
 我们可以维护一个映射表,将会话ID与对应的服务器IP做映射。这样简单,但是映射表会很大。客户端上下线、服务端上下线,都要维护,维护成本高。
 我们借助哈希算法,对每个会话ID计算哈希值。将取得的哈希值与服务器列表大小取余,得到最终服务器编号。

6 数据分片

统计日志文件中搜索词次数
 如果日志文件很多很大,单台计算内存可能不够,而且计算也很慢。可以考虑分布式计算。我们对搜索词取哈希值,然后跟服务器个数取余,最终得到的值就是服务器编号。这样同样的关键词就被分配到同一台服务器,进而计算出现次数。

7 分布式存储

一致性哈希
 我们可以通过哈希算法把数据分别存储到某台服务器上。如果需要增加一台服务器,则所有缓存的数据都失效,需要再次计算哈希值取余,放到新的服务器上。但是此时对数据库压力很大,容易形成雪崩。
 解决的方法是采用一致性哈希。我们把哈希值想象为一个闭环。
 在这里插入图片描述
 整个空间按顺时针方向存储。当插入数据A、B、C、D的时候,如下图所示。A存储咋server1,B、C存储在server2,D存储在server3。假设server3发生意外宕机,只需要把数据D迁移到seerver2。
 在这里插入图片描述
 
 假设我们有k个服务器,哈希值的取值范围是[0,MAX]。我们将哈希值分为m个区间(m远大于k),每个机器负责m/k个小区间。当有新机器加入的时候,我们就将某几个小区间的数据,从原来的机器上搬移到新的机器中。这样既不会重新哈希全部的数据,也保持了各个机器上的数据量的均衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring学习(6):使用xml方式实现spring基本应用

接着上一节的课程继续学习 在resources文件下建立applicationconText applicationconText.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3…

[burp][CTF]burp intruder爆破出现 Payload set 1: Invalid number settings的解决办法

这是一个软件bug 如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示&#xff0c;先点hex 后点 decimal 再开始start attrack&#xff0c;需要手动让它刷新。

数据结构五——二叉树

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 树 1.1 概念 概念&#xff1a;树、根、父节点、子节点、叶子节点。 几个度&#xff1a;高度、深度、层。与实际生活中的这几个概念类比。 高度&#xff1a;从下往…

spring学习(7):加入log4g日志系统

点击show dependencies popup 修改pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

[hackinglab][CTF][脚本关][2020] hackinglab 脚本关 writeup

脚本关 1 key又又找不到了 关键字&#xff1a; 知识点&#xff1a; 步骤:点击提供的链接后&#xff0c;实际发生了两次跳转&#xff0c;key 在第一次跳转的网页中&#xff0c;key is : yougotit_script_now 脚本关 2 快速口算 关键字&#xff1a; 知识点&#xff1a;python基…

用递归树求解递归算法时间复杂度

文章内容、图片均来自极客时间。 递归代码复杂度分析起来比较麻烦。一般来说有两种分析方法&#xff1a;递推公式和递归树。 1 递推公式法 归并排序的递推公式是&#xff1a; merge_sort(p…r) merge(merge_sort(p…q), merge_sort(q1…r)) 终止条件&#xff1a; p > r …

spring学习(8):log4j.properties 详解与配置步骤

一、入门实例 1.新建一个JAva工程&#xff0c;导入包log4j-1.2.17.jar&#xff0c;整个工程最终目录如下 2、src同级创建并设置log4j.properties ### 设置### log4j.rootLogger debug,stdout,D,E### 输出信息到控制抬 ### log4j.appender.stdout org.apache.log4j.ConsoleAp…

[hackinglab][CTF][注入关][2020] hackinglab 注入关 writeup

服务器挂了 咕咕咕 参考链接&#xff1a;https://blog.csdn.net/weixin_41924764/article/details/107095963?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-bl…

数据结构六——堆

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 堆定义 1.1 定义和结构 堆是一个完全二叉树&#xff08;完全二叉树&#xff1a;除了叶子节点外每一层节点都是满的&#xff0c;最后一层的子节点都靠左排列&…

spring学习(9):idea的config配置

点开eventlog 点击之后 勾选 apply---ok

[hackinglab][CTF][上传关][2020] hackinglab 上传关 writeup

上传关 1 请上传一张jpg格式的图片 关键字&#xff1a; 步骤&#xff1a; 1.F12查看源码 2.输入网址 获得key http://lab1.xseclab.com/upload1_a4daf6890f1166fd88f386f098b182af/upload_file.php上传关 2 关键字&#xff1a;burp 知识点&#xff1a; 步骤&#xff1a;看源…

靠谱的Pycharm安装详细教程

如何在本机上下载和安装Pycharm&#xff0c;具体的教程如下&#xff1a; 1、首先去Pycharm官网&#xff0c;或者直接输入网址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff0c;下载PyCharm安装包&#xff0c;根据自己电脑的操作系统进行选择…

第四十四期:Keep突然大裁员,回应称“属正常调整”!

10 月 24 日程序员节原本是程序员们最开心的一天&#xff0c;但 Keep 程序员却开心不起来&#xff0c;因为不少人突然面临失业危机。\ 作者&#xff1a;51CTO 10 月 24 日程序员节原本是程序员们最开心的一天&#xff0c;但 Keep 程序员却开心不起来&#xff0c;因为不少人突然…

第四十五期:万亿级日访问量下,Redis在微博的9年优化历程

Redis在微博内部分布在各个应用场景&#xff0c;比如像现在春晚必争的“红包飞”活动&#xff0c;还有像粉丝数、用户数、阅读数、转评赞、评论盖楼、广告推荐、负反馈、音乐榜单等等都有用到Redis。 作者&#xff1a;兰将州来源 一、Redis在微博的应用场景 Redis在微博内部…

数据结构七——图

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 基本概念 顶点、边 微信&#xff1a;A和B是好朋友&#xff0c;B也和A是好朋友&#xff0c;A和B之间有条边。 入度&#xff1a;每个顶点链接的边的个数每个人好朋友…

[CTF][Web][PHP][JavaScript]弱类型问题

弱类型问题 类型转换是无法避免的问题。例如需要将GET或者是POST的参数转换为int类型&#xff0c;或者是两个变量不匹配的时候&#xff0c;PHP会自动地进行变量转换。但是PHP是一个弱类型的语言&#xff0c;导致在进行类型转换的时候会存在很多意想不到的问题。 如果在用于密…

第四十六期:最近程序员频繁被抓,如何避免面向监狱编程?!

最近&#xff0c;有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传&#xff1a;"某程序员因为接了个外包&#xff0c;帮别人写了个软件&#xff0c;结果这个软件被用于赌博导致被抓。某公司利用爬虫抓取用户信息&#xff0c;最后被发现&#xff0c;导致该公司的程序员被…

算法五——字符串匹配(上)

文章内容、图片均来自极客时间。 如何借助哈希算法实现高效字符串匹配 1 概念和用途 字符串匹配&#xff1a;查找一个字符串A在字符串B中是否出现&#xff0c;这个过程就是字符串匹配。A称为模式串&#xff0c;B称为主串。主串的长度记为n&#xff0c;模式串长度记为m。n>…

算法五——字符串匹配(中)

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1文本编辑器中的查找功能怎么实现 在word中有一个功能&#xff1a;查找某个字符串&#xff0c;将其替换为另一个字符串&#xff0c;就会用到这个功能。 需要新算法的…

第四十七期:漫画:什么是公有云、私有云和混合云?

为了方便大家理解&#xff0c;我们尽量用通俗的语言和举例子的方式讲解&#xff0c;并且文中还配备了漫画供大家参考学习。 作者&#xff1a;漫话编程 为了方便大家理解&#xff0c;我们尽量用通俗的语言和举例子的方式讲解&#xff0c;并且文中还配备了漫画供大家参考学习。 …