哈希

哈希算法在分布式系统中的应用(极客时间)

别来无恙 提交于 2019-12-28 16:20:26
1.负载均衡 1.1.需求 如何实现一个会话粘滞(session sticky)的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。 1.2.解决方案 通过哈希算法对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个IP过来的请求都路由到同一个后端服务器上。 2.数据分片 2.1.如何统计“搜索关键词”出现的次数? ①需求描述 假如我们有1T的日志文件,这里面记录了用户的搜索关键词,我们想要快速统计出每个关键词被搜索的次数,该怎么做呢? ②问题分析 这个问题有两个难点,第一个是搜索的日子很大,没办法放到一台机器的内存中。第二个是只用一台机器来处理这么巨大的数据,处理时间会很长。 ③解决方案 先对数据进行分片,然后采用多台(比如n台)机器进行处理。具体做法:从搜索记录的日志文件中依次读取每个关键词,并通过哈希函数计算该关键词的哈希值,然后跟机器的台数n取模,最终得到值就是该关键词应该被分到的机器编号,这样相同的关键词一定会被分配到同一台机器上,数据分配完成后,由多台机器并行进行统计,最后合并起来就是最终结果。 实际上,这里的处理过程也是 MapReduce 的基本设计思想。 2.2.如何快速判断图片是否存在图库中? ①需求描述 假设现在我们的图库中有1亿张图片

借 redis cluster 集群,聊一聊集群中数据分布算法

◇◆丶佛笑我妖孽 提交于 2019-12-27 18:20:32
Redis Cluster 集群中涉及到了数据分布问题,因为 redis cluster 是多 master 的结构,每个 master 都是可以提供存储服务的,这就会涉及到数据分布的问题,在新的 redis 版本中采用的是虚拟槽分区技术来解决数据分布的问题,关于什么是虚拟槽分区技术我们后面会详细的介绍。在集群中除了虚拟槽分区技术之外,还有几种数据分布的算法,比如哈希算法,一致性哈希算法,这篇文章我们就来一起聊一聊这几种数据分布算法。 因为是集群,所以我们需要一个大前提,在这篇文章中假设 redis cluster 集群中有三台 master,我们需要存储的数据集为: [{id:1,"name":"1"},{id:2,name:"2"},{id:3,name:"3"},{id:4,name:"4"},{id:5:"name":"5"},{id:6,"name":"6"}] ,在这个大前提下,我们来聊一聊集群中的数据分布算法。 哈希算法 哈希算法在分布式架构中应用广泛,不仅仅是数据存储,还有负载均衡等应用上有用的比较多,哈希算法的思想非常简单,也许你知道 HashMap 的哈希函数,哈希算法跟 HashMap 一样,也是通过一个哈希函数得到某一个数字,然后根据数字找到相应的服务器。哈希算法的哈希函数比较简单,一般是根据某个key的值或者key 的哈希值与当前可用的

Java面试准备之算法

a 夏天 提交于 2019-12-27 02:42:38
1、一致性哈希算法 参考文章: 一致性哈希算法 描述: 通过传统哈希算法寻找目标服务器的时候,通常是将哈希值根据目标服务实例的数量来进行取模。例如有3个服务实例,哈希值计算得14,14对3取模得2,则目标服务器的实例为2号服务实例。 传统哈希算法是有弊端的。如果服务的实例数量发生了更改,绝大多数缓存内容的模值会发生改变,此时会发生缓存雪崩。 一致性哈希算法和传统哈希算法的区别在于,一致性哈希算法并不对服务实例的数量取模,而是对一个固定的数字取模,这个数字就是2^32,即无符号整型的最大值。这样得到的哈希数值不会随着服务数量的改变而改变。 对于需要缓存的数据,计算其哈希值,并根据哈希值向下寻找第一个服务器,就是这个数据缓存的目标服务实例。如果寻找到了最大的数值2^32-1,则从0开始继续寻找。 当插入新的服务实例时,受到影响的缓存数据,只有哈希值在从 哈希值小于当前服务实例的第一个服务实例的哈希值,到当前服务实例哈希值之间数据,才会受到影响。 2、LRU算法 LRU(Least Recently Used)即最近最少使用算法。 LRU算法的原理比较简单,数据存储的数据结构为链表。当访问数据时,如缓存中有数据,则将该数据移动至链表的顶端;没有该数据则在顶端加入该数据,并移除链表中的低端的数据。 3、零拷贝 对于“文件拷贝+socket发送”操作,实现方式: 3.1 传统方式: File

PHP(超文本预处理器)简介

爱⌒轻易说出口 提交于 2019-12-26 04:17:54
PHP(超文本预处理器) PHP即“ 超文本预处理器 ”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。 中文名:超文本预处理器 外文名:PHP: Hypertext Preprocessor 编程范型 面向对象、命令式编程 简介 PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。自20世纪90年代国内互联网开始发展到现在,互联网信息几乎覆盖了我们日常活动所有知识范畴,并逐渐成为我们生活、学习、工作中必不可少的一部分。据统计,从2003 年开始,我国的网页规模基本保持了翻番的增长速度,并且呈上升趋势。PHP 语言作为当今最热门的网站程序开发语言,它具有成本低、速度快、可移植性好、 内置丰富的函数库等优点,因此被越来越多的企业应用于网站开发中。但随着互联网的不断更新换代,PHP语言也出现了不少问题。 根据动态网站要求,PHP语言作为一种语言程序,其专用性逐渐在应用过程中显现,其技术水平的优劣与否将直接影响网站的运行效率。其特点是具有公开的源代码, 在程序设计上与通用型语言,如C语言相似性较高,因此在操作过程中简单易懂,可操作性强。同时

Java集合List、Set、Map

╄→尐↘猪︶ㄣ 提交于 2019-12-25 17:57:39
集合是 java 基础中非常重要的一部分,同样也是 Java 面试中很重要的一个知识点。所以,给王小整理了这篇关于集合的文章。 1、接口继承关系以及实现 集合类存放于 Java.util 包中,主要有 3 种:set、list 和 map。 Collection:Collection 是集合 List、Set、Queue 的最基本的接口 Iterator:迭代器,可以通过迭代器遍历集合中的数据 Map:是映射表的基础接口 层次关系图: 2、List Java 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类:分别是 ArrayList、Vector 和 LinkedList。 2.1、ArrayList ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 2.2、Vector Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写 Vector

哈希结构及应用

拟墨画扇 提交于 2019-12-25 17:45:36
哈希 可以不经过任何比较,一次直接从表中得到搜索的元素,像那些 vecotor ,list ,AVL 呀,都是必须经过比较之后才能找到元素的,所以哈希在查找元素方面时间复杂度是O(1) 那它是怎么做到的呢?其实是通过某种函数使元素的存储位置与它的关键码之间建立一种映射关系 哈希表的实现主要是 构造哈希 和 处理哈希冲突 两方面 我们先讨论如何构造,最后讨论如何处理哈希冲突 对于构造哈希来说,常见的哈希函数包括 直接地址法 , 除留余数法 ,平方取中法,折叠法,随机数法… 那么选择什么样的哈希函数主要取决于关键字的特点 (1) 如果事先知道关键字的分布情况,并且发现这些关键字很小,而且连续,那么就可以采用 直接地址法或者除留余数法 直接地址法 :取关键字的某个线性函数为散列地址:Hash(Key)= A * key + B 除留余数法 :假如散列表中允许的地址数为 m ,取一个不大于 m 且最接近 m 的一个质数 p 作为除数 ,按照哈希函数 Hash(key) = key % p (p<=m),将关键码转换成哈希地址 (2) 如果不知道关键的分布,且这些关键字的位数也不大,就可以采用平方取中法。 平方取中法:对一个数平方后取出中间的数字作为哈希地址,这种方法适合于不知道关键字的分布且位数也不是很大的情况 (3) 如果不知道关键字的分布,且这些关键字的位数很大的情况,可以采用折叠法。

【MySQL】索引

岁酱吖の 提交于 2019-12-24 19:01:17
什么是索引 索引就好比是书的目录,可以显著提高数据库查询的效率。例如像一本很厚的书,在没有目录的情况下要查到你想要看的知识点,都不知要找到什么时候,但通过目录我们可以很快的查询到对应的内容。 索引的数据结构 哈希表 哈希表是一种以K-V值存储的数据结构,这样,我们只需要输入K值,就会很快得到需要的V值。K值经过哈希计算得出,这样避免不了哈希碰撞问题,解决的方法是当K值哈希后一样时,可以采用列表的形式存储相应的数据,在查询时再经过列表逐一比对得到V值。哈希表在等值查询的时候非常快,但会存在下面问题: 1、无法进行范围查询 2、无法利用索引进行排序 3、存在哈希碰撞问题,当哈希碰撞过于严重时很影响效率 4、不支持最左前缀 有序数组 有序数组可以很好的解决范围查询的问题,查询数据也可以用二分法很快的找到对应的值。但在中间插入一条数据时,需要把后面的数据都往后移,代价太大。 二叉搜索树 二叉搜索树每个节点最多只有两个子节点,并且左节点小于等于父节点,右节点大于父节点。这样很好解决了等值查询、范围查询、数据插入的问题。但因为只有两个节点,这样数据量很大的时候,会产生很高的层级,并且数据库中这些层级不全是存放在内存中的(内存只会存放一级,有时还会存放进二级)而是存放磁盘中。这样就造成了多次IO操作,严重影响性能。 B+树 在二叉搜索树的基础上进行优化,每个节点至多可以达到拥有1200个子节点

区块链区块的构造是什么?

和自甴很熟 提交于 2019-12-23 15:55:41
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、前言 区块链根据不同的应用场景分为应用于公众的公有链,需要授权使用的私有链和联盟链,还有在原有区块链基础上进行扩展的侧链、跨链等,随着区块链的发展,相信还会有其他形式的应用出现。在开始之前我们需要先了解什么是哈希(Hash),哈希又称哈希函数或散列算法,简单的说,哈希函数是用于将任意大小(输入)的数据映射到固定大小输出的任何函数。散列算法应用于数据输入,并且得到的固定长度输出称为散列。 盖一间房子,它的基本单元结构是每一块砖;而组成区块链的基本单元结构,就叫做区块。每个区块由区块头和区块主体组成。 二、区块头 区块头交易数据的公开、可溯源、不可篡改是让区块链与中心化系统相比的最大优势。 区块链由一个个区块组成,每个区块相当于一个小账本。要保障这些小账本的安全,需按照严格顺序排列,并保存到成千上万台电脑上。如何保障这些小账本的顺序,就需要在区块中设置一些参数。这些参数放在一起就组成了小账本的扉页,这就是区块头。 区块头存储结构化的数据,大小是80字节;而区块主体利用一种神奇的树状结构,记录区块挖出的这段时间里所有交易信息,所需空间比较大。平均来讲,假设一个区块内有400笔交易信息,区块主体可能比区区块头中的参数信息规定每一个小账本在一条链的具体位置,让一个个没有关系的小账本组成了一个先后顺序严格确定、不可篡改

PoW共识机制的理解

回眸只為那壹抹淺笑 提交于 2019-12-23 01:30:59
PoW工作量证明(Proof of Work),其概念在比特币出现之前已经有了,比特币的设计区块链的共识机制就参考了POW工作量证明。在比特币中,HASH运算的复杂度进行CPU运算实现工作量确定。 那区块链的PoW共识机制是怎么工作的呢? 我在网上看到了一个很有趣的例子,使用类比的手法来描述区块链PoW共识机制的工作方法。 工作量证明,目的就是要证明工作者确实有花时间完成工作,所以需要验证工作时间。而如果采用单独计时的话,将时间数据与工作成果发给验方,验收方是无法确定时间数据是真是假的。一个好的方法是验收方给工作方发一个难题,工作方要解开此题需要结合自己当前的工作状况(时间等),并且需要一定的时间。这样子验收方在验收的时候,只要确认工作方解开了此题,就说明工作状况没问题,花的时间也足够长。 网上的例子使用了垃圾邮件处理的例子,识别垃圾邮件(发送者用机器多次并自动转发),通过识别其信息编辑的时间来识别,时间太短(工作量不够),说明是机器自动发的垃圾邮件。 因此,验收发需要发送方在发送的邮件里包含一个签名,包括发送时的时间戳,发送地址,字数等(当前的工作状况), 还有一个数字counter,验收方将签名里的数据进行SHA-1散列,得到的160bit数如果前20位是0,则通过,否则不通过。 这就要求邮件发送者在发送之前需要不断的生成counter,使得SHA

RESTful身份验证

故事扮演 提交于 2019-12-22 20:02:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> RESTful身份验证的含义是什么?它是如何工作的? 我无法在Google上找到一个很好的概述。 我唯一的理解是你在URL中传递会话密钥(remeberal),但这可能是非常错误的。 #1楼 我怀疑那些热心地喊“HTTP身份验证”的人是否尝试过用REST创建一个基于浏览器的应用程序(而不是机器到机器的Web服务)(没有冒犯的意图 - 我只是觉得他们没有遇到过复杂的问题) 。 我在RESTful服务上使用HTTP身份验证时发现的问题是生成可在浏览器中查看的HTML页面: 用户通常会得到一个丑陋的浏览器制作的登录框,这对用户不友好。 你不能添加密码检索,帮助框等。 以不同的名称注销或登录是一个问题 - 浏览器将继续向站点发送身份验证信息,直到您关闭窗口 超时很难 铲球这些逐点非常有见地的文章是 在这里 ,但是这导致了 很多 特定浏览器的JavaScript两轮牛车,变通办法变通办法,等等的。 因此,它也不是向前兼容的,因此在发布新浏览器时需要不断维护。 我不认为干净清晰的设计,而且我觉得这是一项额外的工作和头痛,所以我可以热情地向我的朋友展示我的REST徽章。 我相信cookie是解决方案。 但等等,饼干是邪恶的,不是吗? 不,他们不是,饼干经常使用的方式是邪恶的。 Cookie本身只是一条客户端信息