找回密码
 立即注册
查看: 223|回复: 0

hash竞猜游戏的哈希值算法是如何实现?

[复制链接]
发表于 2022-9-8 12:06 | 显示全部楼层 |阅读模式
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.将所有旧数据复制到新数组中。


将节点添加到链表后


将容量扩大两倍,然后重新计算每个节点的哈希值。


这个值只能在两个地方:一个在原下标位置,一个在下标<原下标+原容量>位置。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 01:09 , Processed in 0.129326 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表