hash

HashMap 如何解决hash冲突

落爺英雄遲暮 提交于 2020-02-28 13:36:02
在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样。 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: HashMap<String,Object> m=new HashMap<String,Object>(); m.put("a", "rrr1"); m.put("b", "tt9"); m.put("c", "tt8"); m.put("d", "g7"); m.put("e", "d6"); m.put("f", "d4"); m.put("g", "d4"); m.put("h", "d3"); m.put("i", "d2"); m.put("j", "d1"); m.put("k", "1"); m.put("o", "2"); m.put("p", "3"); m.put("q", "4"); m.put("r", "5"); m.put("s", "6"); m.put("t", "7"); m.put("u", "8"); m.put("v", "9"); HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。 当 程序执行 map.put(String,Obect)方法 时,系统将调用String的

hashMap与concurrentHashMap

杀马特。学长 韩版系。学妹 提交于 2020-02-28 12:22:30
一 功能简介 hashMap与concurrentHashMap 都属于集合,用于存储键值对数据,它两最明显的区别是,hashMap是非线程安全的,concurrentHashMap是线程安全的, concunrrentHashMap还有另外的称呼,如 并发容器 概述 HashMap jdk 1.7 实现方式:底层 数组+链表 jdk 1.8 实现方式:底层 数组+链表+红黑树 初始大小:16 负载因子:0.75 扩容:newSize = oldSize*2; map中元素总数超过Entry数组的75%,触发扩容操作 存放键值对要求:key 和 value 都允许为null,这种key只能有1个 线程安全性:不安全 父类:AbstractMap ConcurrentHashMap jdk 1.7 实现方式:底层 segment数组 + hashEntry数组+链表 segment 数组初始化:在申明 ConcurrentHashMap对象的时候 jdk 1.8 实现方式:底层 node数组+链表+红黑树 node数组初始化:put()第一个元素的时候 默认初始大小 16 负载因子:0.75 线程安全 父类 AbstractMap 二 实现逻辑 2.1 hashMap的内部实现逻辑 JDK1.7 hashmap 里面是一个数组,数组中每个元素是一个Entry类型的实例

过滤器系列(一)—— Bloom filter

烂漫一生 提交于 2020-02-28 06:47:13
因为要做过滤器相关内容,最近读了一些过滤器方面的文章,准备从中提取主要思想写几篇博客。 作为这系列的第一篇文章,首先得讲一下过滤器是干什么用的。从历史发展来看,过滤器最早出现是作为散列表的替代品,那么功能就要和散列表差不多,主要是查询当前的元素是否在我已知的集合里。但是随着数据量不断增大,散列表相对来说占用空间过大,而空间占用小的查找树的 \(O(logn)\) 时间复杂度又太高。于是有人想出来能否用正确率做代价,换取较高的查询速度和较小的存储占用,这就是过滤器。当然,这里所允许的错误仅限假阳性,例如我们做一个关于代理ip地址的过滤器,当有一个不是代理的ip地址发来,我们也许会把它错认成是代理ip,但是我们不会允许一个代理ip被错认成非代理ip,简单的说,就是宁可错杀,不可放过。 作为第一篇,按照历史角度,先说布隆过滤器(bloom filter)。原版的布隆过滤器很朴素,只支持插入和查询两个操作,下面我们看它的原理。 首先,布隆过滤器申请了一片空间,存了一个数组,每个元素都只有1个bit,共有N个元素,初始化每个值都为0。如下图所示。(实际并没有index这一行,仅仅是为了方便观看) 插入操作 下一步就是如何插入数据。布隆过滤器要求你事先定义K个Hash函数,这K个Hash函数都是从定义域映射到上图中的index空间(即N)。通过这K个Hash函数,我们对一条新的数据x,计算出

哈希表&散列表&HashMap

孤街醉人 提交于 2020-02-28 06:43:34
哈希表(Hashtable,也叫散列表),是根据关键码值而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫散列表。 记录的存储位置=f(关键字); 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表; f:将key转换成一个整型数字,然后将该数字对数组长度进行取余,取余结果作为数组的下标,将value存储在以该数字为下标的数组空间中; (好的散列函数=计算简单+计算得到的散列地址分布均匀) 数组的特点:寻址容易,插入和删除困难; 链表的特点:寻址困难,插入和删除容易; 那么,哈希表最常用的一种实现方式——拉链法,结合了二者的特性:左边是一个数组,数组的每个成员包括一个指针,指向一个链表的头,我们根据元素的一些特征把元素分配到不同的链表中去,之后也根据这些特征,找到这些链表,并从链表中找到这个元素; Hash的应用: 1.信息安全领域的加密算法。把不同长度的信息转换为杂乱的128位编码,称为Hash值,也可以说,Hash就是找到一种数据内容和数据存放地址之间的映射关系; 2.查找:以前的查找思路都是逐渐缩小查找范围,而Hash的思路是根据key值直接计算出元素在集合中的位置,根本不需要一次又一次的查找,非常适合海量数据处理,几乎是O(1)的时间复杂度; 优点:查找

C++——散列(hash)

强颜欢笑 提交于 2020-02-28 05:40:45
散列(hash) : 将元素通过一个函数 转换为整数 ,使得该整数可以尽量 唯一 地代表这个元素。 例如,在仅出现"A"~"Z"的字符串就可以通过hash(26*26*26)将 字符型 数据转换为 整型 数据,并且数据 不会发生重复 。代码如下: # include <iostream> using namespace std ; # define MAX 5 //输入数据的数量 int getid ( char * id ) { //将长度为3的字符串转换为整型存储 int i_id = 0 ; for ( int i = 0 ; i < 3 ; i ++ ) i_id = 26 * i_id + ( id [ i ] - 'A' ) ; return i_id ; } int main ( ) { //使用(散列)hash(26*26*26)将字符型数据转换为整型数据 const int maxn = 26 * 26 * 26 ; int s [ maxn ] , i_id ; char c_id [ MAX ] [ 3 ] ; for ( int i = 0 ; i < MAX ; i ++ ) { cin >> c_id [ i ] ; //输入字符型数据 i_id = getid ( c_id [ i ] ) ; //将字符型转换为整型 s [ i ] = i_id ;

分布式集群架构学习笔记

为君一笑 提交于 2020-02-28 03:09:21
分布式和集群 分布式和集群是不⼀样的,分布式⼀定是集群,但是集群不⼀定是分布式(因为集群就是多个实例⼀起 ⼯作,分布式将⼀个系统拆分之后那就是多个实例;集群并不⼀定是分布式,因为复制型的集群不是拆 分⽽是复制) 第⼀部分 ⼀致性Hash算法 Hash算法,⽐如说在安全加密领域MD5、SHA等加密算法,在数据存储和查找⽅⾯有Hash表等, 以上 都应⽤到了Hash算法。 为什么需要使⽤Hash? Hash算法较多的应⽤在数据存储和查找领域,最经典的就是Hash表,它的查询效率⾮常之⾼,其中的 哈希算法如果设计的⽐较ok的话,那么Hash表的数据查询时间复杂度可以接近于O(1),示例 需求:提供⼀组数据 1,5,7,6,3,4,8,对这组数据进⾏存储,然后随便给定⼀个数n,请你判断n是否存在 于刚才的数据集中? list:List[1,5,7,6,3,4,8] // 通过循环判断来实现 for(int element: list) { if(element == n) { 如果相等,说明n存在于数据集中 } } 以上这种⽅法叫做顺序查找法 :这种⽅式我们是通过循环来完成,⽐较原始,效率也不⾼ ⼆分查找:排序之后折半查找,相对于顺序查找法会提⾼⼀些效率,但是效率也并不是特别好 我能否不循环!不⼆分!⽽是通过⼀次查询就把数据n从数据集中查询出来???可以! 定义⼀个数组,数组⻓度

HashMap?

…衆ロ難τιáo~ 提交于 2020-02-27 19:08:42
HashMap数据结构是什么? JDK1.7 HashMap由数组+链表组成的,JDK1.8 HashMap由数组+链表+红黑树组成的 数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。 =============================================================================== key-value是通过什么方式存储进去的? key使用set集合来存储的,value使用collection来存储的。 =============================================================================== 解释hashcode、取余、去重等操作? 计算hashcode的值: //这是一个神奇的函数,用了很多的异或,移位等运算

什么是https

牧云@^-^@ 提交于 2020-02-27 11:35:34
没有在自己的网站使用过,纯为了解以及笔记 HTTPS协议 HTTP与HTTPS有什么区别? HTTPS的工作原理 描述1 描述2 描述3 https怎么做到的? https足够安全吗? HTTPS协议 HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密(即HTTP下加入 SSL(Secure Sockets Layer安全套接层) )。在数据进行传输之前,对数据进行加密,然后再发送到服务器。这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的。这就是HTTP和HTTPS的最大区别。 HTTP与HTTPS有什么区别? https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。 http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。 HTTPS的工作原理 描述1 客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如下所示。 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。 Web服务器收到客户端请求后

Hashmap 扩容

谁说我不能喝 提交于 2020-02-26 14:42:17
一、hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表示数组,纵排表示数组元素【实际上是一个链表】)。 从图中我们可以看到一个hashmap就是一个数组结构,当新建一个hashmap的时候,就会初始化一个数组。我们来看看java代码: Java代码 /** * The table, resized as necessary. Length MUST Always be a power of two. * FIXME 这里需要注意这句话,至于原因后面会讲到 */ ransient Entry[] table; static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; final int hash; Entry<K,V> next; .......... } 上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。 当我们往hashmap中put元素的时候