hash

HashMap源码深度解析

大城市里の小女人 提交于 2020-03-04 18:20:07
HashMap源码深度解析 一、重新认识HashMap 什么是HashMap? HashMap底层基于散列(Hash)算法,采用hash表实现键值对集合,继承了AbstractMap,实现了Map接口。最早出现在jdk1.2,允许null键和null值,null键的哈希值为0。需要注意的是HashMap不保证键值对顺序,同时非线程安全。 长啥样? 散列算法分为散列再探测和拉链式,HashMap采用的是拉链式,并在jdk1.8后使用红黑树优化长度大于等于8的链表。也就是说,目前HashMap底层数据结构为: 数组+链表+红黑树 。 数据结构如下图: 如上图所示,HashMap的数据结构采用数组和单链表(或者红黑树)组成,在进行增删改查时首先根据要查找元素的hash值定位到元素所在的数组下标(也称为桶),然后再根据这个桶所存储的元素的类型(单个node,单链表或红黑树)来找到该元素。 当单链表长度大于等于8时,转化为红黑树;当红黑树长度小于6时红黑树转化为链表。 HashMap特点 可以接受null键和null值,null键的hash值时0; 元素无序,可以序列化,线程不安全; 添加,查询的时间复杂度基本都是O(1); 存储元素时,根据键的hash值找到对应的桶。如果出现不同的对象计算出来的hash值相同,也就是hash冲突。为了解决这个问题

redis的应用场景

心已入冬 提交于 2020-03-04 04:09:16
redis的应用场景 目录 1、充值订单超时队列 2、缓存系统 3、计数器 4、消息队列系统 5、Bitmap 6、HyperLogLog 7、list集合的使用 8、hash的使用 9、sunionstore 1、充值订单超时队列 创建充值订单时,将订单号chargeOrderId、账号信息id、超时开始时间timeoutCreateTime添加进redis。用getRedisKey方法将两个参数组建成一个可以切割的key,可以中间加上分割符号“:” redisClusterClient.zadd("NEW_CHARGE_ORDER", timeoutCreateTime, getRedisKey(chargeOrderId, id)); 在项目中创建一个ChargeOrderTimeoutTimerTask任务,用quartz进行处理,定时按周期执行该定时任务 public void run() { long orderTimeout = 3 * 60 * 1000; long time = new Date().getTime() - orderTimeout; Set<String> set = redisClusterClient.zrangeByScore("NEW_CHARGE_ORDER", 0, time); for(String key : set){ /

海量数据处理

心已入冬 提交于 2020-03-04 00:37:21
海量数据处理,思路有hash、bitmap、merge、堆、Top K(BFPRT算法)、trie树、布隆过滤器。 hash:对很多数据进行hash,然后取余一个正整数n,可以分成n份不同的数据组,每份数据组中数据通过hash算法得到相同的下标,所以相同的数据一定会分在同一数据组中。 bitmap:为操作,如果为每个数据分配n个bit,那么每个数据可最多有2^n种情况,在很多数据的情况下,bitmap总长可设为很大并间隔n位分给一格数据。 merge:一个很大数据量数据排序,分成不同数据组,每组内进行排序,不同组之间进行merge排序。 堆排序:数据量大,而只需要知道最大或最小的几个,可以用堆排序。 Top K:https://blog.csdn.net/laojiu_/article/details/54986553 速度很快(类似快排选一个基准,不过这个基准选取方式为:n个数据5个一组,每个排序得到组内中位数,各组之间中位数排序得到组间中位数,该中位数为基准,大于该值一边,小于的另一边,则最终左边和右边都至少有3/10的数据量,递归下去最后得到想要的位置)。 trie数(字典树):用于去重字符串。字典树每个树枝(两个节点之间连线)一个字符,从根节点到叶子节点构成了不同的路径,每个路径唯一地表示了一个字符串。 布隆过滤器:使用了bitmap和hash,一个数据散列出n个特征点

hash

别等时光非礼了梦想. 提交于 2020-03-04 00:01:56
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。 Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。 [1] Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。 常用HASH函数 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。常用Hash函数有: 1.直接寻址法。取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法

HashMap-resize重定位

爷,独闯天下 提交于 2020-03-03 16:58:53
​常量 // 默认初始化容量 16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4 ; // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30 ; // 默认加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f ; // 链 转 tree 的 节点个数 下限阈值 static final int TREEIFY_THRESHOLD = 8 ; // tree 转 链 的 节点个数 上限阈值 static final int UNTREEIFY_THRESHOLD = 6 ; // 链 转 tree 时 存储数组table的容量下限阈值. table.length小于此值时 resize()扩容。 static final int MIN_TREEIFY_CAPACITY = 64 ; 变量 // Node存储数组,在resize方法中初始化或扩容. 长度一定是 2的次方! transient Node<K,V>[] table; // 内部类 EntrySet,值对缓存 transient Set<Map.Entry<K,V>> entrySet; // table中Node的数量 transient int size; //

HashMap分析

眉间皱痕 提交于 2020-03-03 16:51:36
目录 存储结构 初始化 put resize 树化 get 为什么HashMap中equals()和hashCode()要同时重写? 为何HashMap的数组长度一定是2的次幂? 线程安全 参考 存储结构 JDK1.8前是数组+链表,JDK1.8之后是数组+链表+红黑树。本文分析基于JDK1.8源代码。 HashMap的基础结构是Node ,它存着hash、键值对,Node类型的指针next。 主干是桶数组,链表bin用于解决hash冲突,当链表的Node超过阈值(8),执行树化操作,将该链表改造成红黑树。 图片来源:Java核心技术36讲 初始化 HashMap有4个构造器,其他构造器如果用户没有传入initialCapacity (容量)和loadFactor(负载因子)这两个参数, 会使用默认值 ,initialCapacity默认为16,loadFactory默认为0.75。 基于lazy-load原则,主干数组table的内存空间分配不在初始化中,而是在put中。 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " +

128 bit hash without collisions guaranteed

微笑、不失礼 提交于 2020-03-03 12:49:21
问题 Is there a 128 hashing algorithm (no matter if it is a crypto or non-crypto hashing) that guarantee no collision could occur? If can guarantee my string would not exceed a specific length (is there such length? - I can guarantee a length less than 100 chars) Thanks, J.B 回答1: No you can't make such an algorithm. If you have a string with 100 characters, you have (let character be in 1..255 range) 256**100 == (2**8)**100 == 2**800 different strings (pontential collisions); 128 bit hash function

128 bit hash without collisions guaranteed

江枫思渺然 提交于 2020-03-03 12:48:07
问题 Is there a 128 hashing algorithm (no matter if it is a crypto or non-crypto hashing) that guarantee no collision could occur? If can guarantee my string would not exceed a specific length (is there such length? - I can guarantee a length less than 100 chars) Thanks, J.B 回答1: No you can't make such an algorithm. If you have a string with 100 characters, you have (let character be in 1..255 range) 256**100 == (2**8)**100 == 2**800 different strings (pontential collisions); 128 bit hash function

location.href 与 location.hash

不想你离开。 提交于 2020-03-03 05:25:20
this.hash 获取或设置标签值(jquery) (2015-03-03 15:34:13) 转载 ▼ 标签: this.hash jquery 使用出处: this.hash含义: location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url。而location.hash则可以用来获取或设置页面的标签值,也就是锚链接的值。比如 http://domain/#admin 的location.hash="#admin"。 this.hash:获取当前链接的标签值: location.hash 综:window. location.href 表示 重定向 ,后面跟着的是完整的 url地址 ,与其相似的还有window. location.hash , 下面来比较window.location.href和window.loc ai ton.hash的区别。 (1) window.location.href 得到和使用的是完整的url,比如window.location.href="w ww.baidu.com ”表示的是重新定向,页面跳转 到新的页面。也可以通过window.location.href得到a标签的完整的href,比如<a href="#book"

Passwords and different types of encryption

孤者浪人 提交于 2020-03-03 01:08:46
问题 I know, I know, similar questions have been asked millions and billions of times already, but since most of them got a different flavor, I got one of my own. Currently I'm working on a website that is meant to be launched all across my country, therefore, needs some kind of protection for user system. I've been lately reading alot about password encryption, hashing, salting.. you name it, but after reading that much of articles, I get confused. One says that plain SHA512 encryption is enough