hash竞猜游戏的哈希值算法是如何实现?
hash哈希是一种通过对数据进行紧缩,从而进步效率的一种处理方法,但因为哈希函数有限,数据增大等原因,哈希冲突成为数据有效紧缩的一个难题。本文主要介绍哈希值得算法方案,以及各种哈希冲突的处理战略上的优缺点。(哈希竞猜游戏开发源码/搭建看头像+++)如何优化1中的哈希算法和寻址算法?JDK 1.8?
哈希算法:hash = (h = key.hashcode ()) (h > > > 16)
寻址算法:(n-1)& hash = = = = = = = = hash对n的取模是一样的——定位数组的索引位置。
和运算(&),取模性能很差(数组长度永远是2的n次方,只要保持数组长度保持2的n次方)
在哈希算法优化之前,寻址的核心在于低16位之间的AND运算。
哈希算法的优化:对于每个哈希值,在其低16位中,让高低16位进行了异或(^),使其低16位同时保持高16位和低16位的特征,尽量避免一些后续的哈希值冲突,使大家可能进入数组的相同位置。
寻址算法的优化:用AND运算代替模运算以提高性能。
2.2HashMap怎样解决了哈希冲突的问题?
当哈希冲突发生时,链表会挂在这个位置。在这个链表中,将放置多个元素,这样多个键值对可以同时放在数组的一个位置。
假设链表很长,可能导致遍历链表,性能很差,O(n)
优化:如果链表的长度达到一定长度(8),就会把链表变成红黑树,遍历红黑树找到一个元素。O(logn)性能高于链表。
3.3。哈希怎样扩展?
输入扩容有两种情况:
当底部数组为空时,添加一个数据——“扩展”
添加一个数据后,判断当前数组长度是否大于阈值,如果是,则进行扩展。
2倍的容量扩展(减少哈希冲突),并且当数组改变时将执行重新哈希。
扩展过程:
1.找到新的容量大小和新的阈值大小。
2.将所有旧数据复制到新数组中。
将节点添加到链表后
将容量扩大两倍,然后重新计算每个节点的哈希值。
这个值只能在两个地方:一个在原下标位置,一个在下标<原下标+原容量>位置。
页:
[1]