哈希算法

一致性Hash算法

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-28 12:50:17
一致性Hash算法 一致性Hash算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot Spot)问题,初衷和CARP十分相似。一致性Hash修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 一致性Hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布在所有的缓冲(Cache)中去,这样可以使得所有的缓冲空间得到利用。很多哈希算法都能够满足这一条件。 2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应该能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会映射到旧的缓冲集合中的其他缓冲区。 3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上去,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度

浅析ketamahash和murmurhash

末鹿安然 提交于 2019-11-28 02:47:22
说来赶巧,之前我有16个redis集群,然后我要将某个key根据路由规则存到16个集群中的某一个上面,正巧用到了这两种哈希算法,改造完毕上线后,整体带来的效果也十分理想。 说道ketamahash,它是一致性哈希算法,一般说来都是由若干固定的虚拟节点来计算出每个虚拟节点的slots,数据存储的时候,算出key的slot值,然后存入相邻最近的虚拟节点。而murmurhash则是散列算法,由于其计算产生的结果足够剧烈,所以是目前最好的几种散列算法之一。它主要用来计算出key的slot值的。有人会问,java中的hashcode也能计算出来呀,但是hashcode计算出来的值的剧烈程度远远比不上murmurhash。拿abc和abd来说,hashcode计算出来的差值相差不大,但是murmurhash计算出来的差值则相差甚远。 二者结合,可以实现出类似redis cluster使用的路由算法,且效果也是很好的。目前已知的开源中,jedis,memcache,redis等都有采用过,所以将这两种哈希算法吃透,可谓是如虎添翼。 学东西不要急躁,要慢,要注重质量,网络上看的,源码中读的,都属于纸上得来终觉浅的东西,一定要自己写,写完后还能写成文章讲述出来,这样,你才能算是真正的吃透了。切忌看过一点源码就高谈阔论,殊不知如同浮沙筑高台,经不起推敲。 来源: https://www.cnblogs

Hash一致性算法底层原理

╄→尐↘猪︶ㄣ 提交于 2019-11-27 22:24:52
大纲 Hash取余算法 判定哈希算法好坏的四个定义 一致性Hash算法的两大设计 Hash取余算法 hash( Object.key) %N,hash值随Object.key、N的变化而变化。 如果有节点(集群中节点增减太正常)发生变化,几乎重新分配,意味着所有已经分配好的数据都要迁移到新的节点上。 一致性Hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义 : 1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布在所有的缓冲(Cache)中去,这样可以使得所有的缓冲空间得到利用。很多哈希算法都能够满足这一条件。 2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应该能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会映射到旧的缓冲集合中的其他缓冲区。 3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上去,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度

A - Number Sequence 哈希算法(例题)

大憨熊 提交于 2019-11-27 13:44:33
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one. InputThe first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which

[收藏]Memcached 集群架构方面的问题

纵饮孤独 提交于 2019-11-27 11:21:20
这里收集了经常被问到的关于memcached的问题 memcached是怎么工作的? memcached最大的优势是什么? memcached和MySQL的query cache相比,有什么优缺点? memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点? memcached的cache机制是怎样的? memcached如何实现冗余机制? memcached如何处理容错的? 如何将memcached中item批量导入导出? 但是我确实需要把memcached中的item都dump出来,确实需要把数据load到memcached中,怎么办? memcached是如何做身份验证的? 如何使用memcached的多线程是什么?如何使用它们? memcached能接受的key的最大长度是多少?(250bytes) memcached对item的过期时间有什么限制?(为什么有30天的限制?) memcached最大能存储多大的单个item?(1M byte) 为什么单个item的大小被限制在1M byte之内? 为了让memcached更有效地使用服务器的内存,可以在各个服务器上配置大小不等的缓存空间吗? 什么是binary协议?它值得关注吗? memcached是如何分配内存的?为什么不用malloc/free!?究竟为什么使用slab呢

哈希算法

烈酒焚心 提交于 2019-11-26 20:25:58
最近参加了集训,学了很多新的算法。所以8月20号左右会开始写博客( 才不是因为接下来几天要出去旅行 ) 今天学习了字符串。大概学习了:哈希(Hash),KMP,Trie树,Trie图,AC自动机,后缀数组……(其实后面几个没太听懂……) 准备着先写写模板。但是发现:哈希网上的模板大多数都是对于一整个字符串make_hash。 那哈希的一个很大的优点—— 在 𝑂(1) 的时间内求出字符串的任意一个子串的哈希值 ,不就很不方便了吗? 所以自己苦思冥想( 大量翻阅其他的文献 )加上询问巨佬队友,总算写出了 类似于前缀和的哈希!! (不过后来发现网上也有…… %%% ) 对于字符串 S,我们常用的哈希方式是将它转化为一个整数: 𝑟𝑒𝑠=𝑆[1]∗𝑥 n-1 +…+𝑆[𝑛] (我比较喜欢字符数组下标从1开始) 其中 x 是我们选取的一个底数(一般 res 需要对一个质数取模)。 至于自然溢出。。。现在已经构造出能够卡掉所有哈希底数的自然溢出的字符串了 (他死了) 。 而重点来了: 在一般做题时,我们会设 f[i] 表示前缀 i 的哈希值。 这样就能让我们在 𝑂(1) 的时间内求出字符串的任意一个子串的哈希值(要先预处理了底数的幂)      𝑓[𝑙…𝑟]=𝑓[𝑟]−𝑓[𝑙−1]∗𝑥^(𝑟−𝑙+1)。 哈希算法真的非常优秀,常见用法: 1、由于哈希算法非常玄学,OI

数据结构与算法之美学习笔记:哈希算法-哈希算法在分布式系统中有哪些应用(第22讲)

醉酒当歌 提交于 2019-11-26 19:08:27
上一节,我讲了哈希算法的四个应⽤,它们分别是:安全加密、数据校验、唯⼀标识、散列函数。今天,我们再来看剩余三种应用: 负载均衡、 数据分片、 分布式存储 你可能已经发现,这三个应用都跟分布式系统有关。没错,今天我就带你看下, 哈希算法是如何解决这些分布式问题的。 应用五:负载均衡 1、如何实现一个会话粘滞的负载均衡算法 2、维护映射关系表的弊端 3、借助哈希算法完美解决 应用六:数据分片 1、引子案列 2、难点处理方案 3、问题所在痛点 4、如何快读判断图片是否在图库中 1、对数据进行分片、然后采用多机处理 2、具体方法 3、需要多少台机器 1、散列表中的每个数据单元包含两个信息 2、使用MD5 3、一台机器可以存多少图片 4、如果对一亿张图片构建索引,需要大约十几台机器 5、实际上 应用七:唯一标识 1、分布式存储 2、扩容带来的问题及痛点 1、方法 2、扩容存在的问题 3、雪崩效应、压垮数据库 3、将那个数据放到那个机器上呢 1、所以我们需要一种方法 2、解决方案 3、一致性哈希算法 解答开篇 & 内容小结 1、解答开篇 2、内容小结 来源: https://www.cnblogs.com/luoahong/p/11330458.html

密码学技术在区块链系统中的应用

爱⌒轻易说出口 提交于 2019-11-26 03:22:56
密码学技术是区块链数据核心技术(P2P网络协议、共识机制、密码学技术、账户与存储模型)中核心的技术点,区块链主要用到的密码算法有哈希算法和加密算法,加密又包括对称性加密和非对称性加密两个概念,区块链系统里面一般常用到的是非对称加密。 本文首先把密码学相关的知识说明一下,并附有部分JAVA代码,然后用比特币作为例子说明一下在区块链系统中的使用。 【算法说明】 (一)哈希算法 哈希算法是区块链中用的最多的一种算法,它被广泛的使用在构建区块和确认交易的完整性上。 它是一类数学函数算法,又被称为散列算法,需具备三个基本特性: 1、其输入可为任意大小的字符串 2、它产生固定大小的输出 3、它能进行有效计算,也就是能在合理的时间内就能算出输出值 如果要求哈希算法达到密码学安全的话,我们还要求它具备以下三个附加特性: 1、碰撞阻力: 是指对于两个不同的输入,必须产生两个不同的输出。如果对于两个不同的输入产生了相同的输出,那么就说明不具备碰撞阻力,或是弱碰撞阻力。 2、隐秘性: 也被称为不可逆性,是指 y = HASH(x)中,通过输入值x,可以计算出输出值y,但是无法通过y值去反推计算出x值。为了保证不可逆,就得让x的取值来自一个非常广泛的集合,使之很难通过计算反推出x值。 3、谜题友好: 这个特性可以理解为,谜题是公平友好的,例如算法中 y = HASH(x),如果已知y值,想去得到x值