Ilingis 发表于 2022-9-8 12:06

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]
查看完整版本: hash竞猜游戏的哈希值算法是如何实现?