菜鸟专辑三:基础的哈希(Hash)算法

一:什么是哈希算法

对于学习该文章的笔记https://www.cnblogs.com/GotoJava/p/7571405.html
散列算法,又称哈希算法。它可以通过一个函数将一个任意长度的数据转化成为长度固定的字符串。
哈希的思路:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。
在哈希表中存在着表的位置和关键字存在某一确定位置。

二:哈希构造函数方法

1.直接定址:
以数据元素关键字k本身或它的线性函数作为它的哈希地址。H(k)=k 或 H(k)=a×k+b ; (其中a,b为常数)

此法仅适合于:地址集合的大小 == 关键字集合的大小,其中a和b为常数。
2.数字分析法:
数字分析法是取数据元素关键字中某些取值较均匀的数字位作为哈希地址的方法。当关键字较多时通过对该关键字的分析丢掉不均匀的位,其他的作为哈希地址。该方法只适用于所有关键字已知的情况,并且预知每个关键字出现的频数
例: 要构造一个数据元素个数n=80,哈希长度m=100的哈希表。不失一般性,我们这里只给出其中8个关键字进行分析,8个关键字如下所示:

K1=61317602 K2=61326875 K3=62739628 K4=61343634

K5=62706815 K6=62774638 K7=61381262 K8=61394220

分析上述8个关键字可知,关键字从左到右的第1、2、3、6位取值比较集中,不宜作为哈希地址,剩余的第4、5、7、8位取值较均匀,可选取其中的两位作为哈希地址。设选取最后两位作为哈希地址,则这8个关键字的哈希地址分别为:2,75,28,34,15,38,62,20。
3.折叠法:
将关键字分割成若干部分,然后取它们的叠加和为哈希地址。两种叠加方式:移位叠加边界叠加
移位叠加:将分割后的几部分低位对齐相加。
边界叠加::从一端沿分割界来回折叠,然后对齐相加。
适用于关键字位数较多,而且关键字中每一位上数字分布大致均匀的情况。
4.平方取中法
先计算出关键字的平方,然后根据哈希表的空间大小,选取平方数是中间几位为哈希地址。
:设哈希表长为1000,则取关键字平方值的中间三位 关键字:1234 关键字的平方:15 227 56 哈希函数值:227
此法适于:关键字中的每一位都有某些数字重复出现频度很高的现象
5.减去法
减去法是数据的键值减去一个特定的数值以求得数据存储的位置。
:公司有一百个员工,而员工的编号介于1001到1100,减去法就是员工编号减去1000后即为数据的位置。编号1001员工的数据在数据中的第一笔。编号1002员工的数据在数据中的第二笔…依次类推。从而获得有关员工的所有信息,因为编号1000以前并没有数据,所有员工编号都从1001开始编号。
6.基数转换法
6.基数转换法
将十进制数X看作其他进制,比如十三进制,再按照十三进制数转换成十进制数,提取其中若干为作为X的哈希值。一般取大于原来基数的数作为转换的基数,并且两个基数应该是互素的。
例Hash(80127429)=(80127429)13=8137+0136+1135+2134+7133+4132+2*131+9=(502432641)10如果取中间三位作为哈希值,得Hash(80127429)=432
为了获得良好的哈希函数,可以将几种方法联合起来使用,比如先变基,再折叠或平方取中等等,只要散列均匀,就可以随意拼凑。
7.除留余数法:
假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为:h(k)=k % p ,其中%为模p取余运算。

理论研究表明,除留余数法的模p取不大于表长且最接近表长m素数时效果最好,且p最好取1.1n~1.7n之间的一个素数(n为存在的数据元素个数
8.随机数法:
设定哈希函数为:H(key) = Random(key),其中,Random 为伪随机函数
此法适于:对长度不等的关键字构造哈希函数。
9.随机乘数法也称为“乘余取整法
(1)确定一个随机实数f,0≤f<1
(2)将随机数与关键字相乘,即f*k取该乘积的小数部分y。
(3)将(2)得到的小数部分y与哈希表的长度n相乘得到z。
(4)将算得的z取其整数部分作为哈希值。
其表达公式为:Hash(k)=「n*(fk%1)」其中“fk%1”表示fk 的小数部分,即fk%1=fk-「fk」
10.旋转法
旋转法是将数据的键值中进行旋转。
可以只输入一个数值从而快速地查到有关学生的信息

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MurmurHash 哈希算法是一种高效、简单的哈希算法,主要应用于散列表的实现。它通过对输入的数据进行多次运算,得到一个固定长度的散列值。 MurmurHash3 第哈希算法是 MurmurHash 的升级版本,与原版本相比,具有更高的散列精度和更优秀的碰撞处理能力。同时,它还支持 128 位散列值,可以更好地防止碰撞。 ### 回答2: MurmurHash是一种非加密的哈希算法,它能够将任意长度的数据映射为固定长度的哈希值。它被设计成快速且高效的哈希函数,适用于一些需要快速哈希计算的场景,如哈希表等。 MurmurHash3是MurmurHash系列的第个版本,相较于之前的版本,有一些改进和优化。MurmurHash3具有良好的分散性和性能,适用于一些需要高速计算的应用场景。 MurmurHash3除了能够生成32位和128位的哈希值,还支持通过seed参数来对结果进行定制化控制。这意味着具有相同的输入数据和相同的seed参数,将得到相同的结果。MurmurHash3还支持并行处理,可以同时计算多个哈希值,提高了计算速度。 MurmurHash3相较于之前的版本,修复了一些潜在的安全漏洞,提供了更好的健壮性。同时,MurmurHash3对于输入数据的大小没有限制,其计算速度基本稳定不受输入数据长度影响。 总之,MurmurHash算法及其第版MurmurHash3是一种高速、高效的哈希算法,常用于对数据进行快速哈希计算。它在分散性、性能和安全性上都有一定的优势,并且支持定制化控制和并行计算。 ### 回答3: MurmurHash是一种快速非加密的哈希算法,主要用于哈希表、散列索引和数据查找等应用中。它是由Austin Appleby在2008年提出的,发展成了多个版本,其中包括MurmurHash2和MurmurHash3。 MurmurHash3是MurmurHash系列中的第版,相比于前两个版本,它有更高的哈希效率和更低的冲突率。MurmurHash3可以计算32位或128位哈希值,具体选择哪个取决于具体的应用需求。 MurmurHash3的实现包括一些变种,主要分为32位和128位两种。32位的MurmurHash3适用于一般的哈希算法需求,它使用了一些位运算和一系列常数来生成哈希值。而128位的MurmurHash3更加适用于对安全性要求较高的场景,它通过增加更多的变换步骤和混淆运算,并使用64位整数来计算哈希值。 MurmurHash3相比于前两个版本具有更好的分布性和更低的冲突率,这使得它在哈希表、哈希集等数据结构中表现更优秀。同时,MurmurHash3的计算速度也非常快速,适合用于对大量数据进行哈希运算的场景。 总的来说,MurmurHash和MurmurHash3都是高效的哈希算法,能够快速计算出哈希值。不同版本的MurmurHash有一些差异,MurmurHash3通过进一步改进和优化,提供了更好的分布性和更低的冲突率,适用于不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值