【算法】哈希算法

本文介绍了哈希算法在快递存储场景中的应用,通过将快递编号映射到货架层数,展示了哈希算法的基本特性:相等对象的哈希码相同,不等对象的哈希码可能相同。同时提到了除法和乘法哈希方法,并指出Java中使用31作为乘数的哈希策略。哈希算法在解决有限存储空间与大量数据映射问题上起到关键作用。
摘要由CSDN通过智能技术生成

最近面试遇到面试官有提到哈希算法,可能比较重要,于是找资料学习整理了一下。

现实中有个应用场景:比如快递站有1000个快递,但只有10个货架,每个货架有5层,要将这1000个快递放入这50层内。

平均下来,每一层放入20个快递,但由于快递尺寸大小,每层可能放入的数量可能不一样。

取快递就直接说取件号,比如第3个快递柜的第2层可以是:0302;第13个快递柜的第4层可以是:1304。

于是,存在以下4个现象:
两个相同货物,一定存放在同一个货架的同一层;
两个不同货物,不一定存放在同一个货架的同一层;
同一个货架的同一层,可能有两个不同货物;
不在同一个货架的同一层,肯定不是同一个货物。

哈希(hash),就是把任意输入,散列为固定长度的输出,这个输出就是哈希值(散列值)。

类似于快递站存放货物,不可能存在足够多的格子分配给每个货物。现实中,不可能将每个键值都对应一个哈希值 ,可能多个键值都对应一个哈希值。

哈希算法
两个对象相等,hashCode一定相等
两个对象不等,hashCode不一定相等
hashCode相等,两个对象不一定相等
hashCode不等,两个对象一定不相等

有几种常见的哈希算法

  1. 除法哈希

hash(key) = key mod M

M一般为素数

  1. 乘法哈希

hash(key) = floor( M/W * ( a * key mod W) )

注意:
通常设置 M 为 2 的幂次方。
W 为计算机字长大小(也为2的幂次方)。
a 为一个非常接近于W的数。

Java就用乘数为31的乘法哈希来求hashCode

更详细的可以参照这个链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值