
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习达内Java编程开发语言,而本文我们就通过案例分析来简单了解一下,Java编程哈希算法都有哪些类型。
一个好的哈希算法对于哈希表是非常重要的,是哈希表具有比较优的时间复杂度和空间复杂度的根本。
什么是好的哈希算法
简单来说,好的哈希算法需要具备两个原则:快速计算和均匀分布。
具体来说,实现一个好的哈希算法会有以下特点:
哈希算法的方向是单向的,从哈希值不能反向推导出原始数据
哈希算法的转换是敏感的,原始数据任何一点变动,得到的哈希值都会大不相同
哈希冲突的概率要极小的,不同的原始数据,经过哈希算法得到的哈希值相同的概率很小
哈希算法的执行效率是高效的,即使是很长的文本也能快速计算出哈希值
直接定址法
直接定址法就是取关键字的某个线性函数值作为哈希值,或者使用这个线性函数值经过特定的算法计算出哈希值。
直接定址法的优点就是简单、分布均匀、不会出现冲突。其缺点也很明显,就是要求选定的线性函数值分布均匀、不会出现冲突。
换一种角度看,直接定址法的限制决定了其并不常用于实际开发。
数字分析法
数字分析法的核心点就是从原始数据中选取一个辨识度较大的数据作为计算哈希算法的关键字,比较常见的就是用于处理关键字位数比较大的数字。
数字分析法有个比较常见的场景,国内的手机号都是11位的数字,而且也常见到将中间4位数字隐藏的做法,这个其实就是数字分析法的一种用法。因为11位手机号的前3位是运营商接入号,中间4位是归属地识别号,后4位是用户号,当手机号码都在同一个地区时,只需要使用前3位和后4位就可以作为哈希算法的关键字。
数字分析法也是一种相对简单的哈希算法,但一般针对较大数字,如果这些较大数字分布均匀的话,可以选用这个方法。
平方取中法
平方取中法的规则如其名。假设关键字是1234,计算得到它的平方就是1522756,再抽取中间三位227可以作为哈希值;假设关键字是4321,计算得到它的平方就是18671041,抽取中间三位671或710作为哈希值即可。
平方取中法比较适合不知道关键字的分布、而位数又不是很大的情况。
折叠法
折叠法主要是将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并根据哈希表的长度,取后几位作为哈希值。
折叠法的应用场景可以和平方取中法互补,适合用在不知道关键字的分布,而位数较多的情况。
除留取余法
除留取余法是常用的哈希算法之一,实际就是对关键字求模取余数,这个余数就是哈希值。但是这种方法得到的哈希值非常容易冲突,这个方法的关键就是要选择合适的除数。
根据前辈们的经验,通常这个除数会选取小于等于哈希表表长的大质数或不包含小于20质因子的合数。
合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数,小的合数是4。
与之相对的是质数,在正整数中,1既不属于质数也不属于合数。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。