获取文件哈希值_浅谈查找---哈希查找

在上一篇综述中,我给出了排序是为了更快的查找这个观点.也介绍了查找的一些典型应用场景如:

1.判断一个给定值,是否在一个数组

2.mysql 的查询优化

3.再到给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,找出a、b文件共同的url.

也简单的介绍了两种查找的方法:

一是遍历查找:

也叫顺序查找,思路为 遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。如果直到最后一个记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。

这个萌蠢的查找思想,是选择排序的基础,不过这里空白太小,我写不下,容我后面再说.

二是二分查找:

也叫折半查找,思路为 在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。

二分查找,要求查找的数列是有序的. 于是,又引入了一个问题,如何排序? ---- 不过同样的,这里空白太小,我写不下.

f82c8f102afc0cb4365f02642af9c5e6.png

费马老爷子

还有其他的诸如 索引查找, 二叉树查找, 哈希查找等方法, 这里我讲讲哈希查找,其他的查找方法,如果您有兴趣了解-----那等我有兴趣写就可以了.....

7c7100244096fd5c1de4fbf58728e5f9.gif

就你皮

哈希(hash),翻译过来叫散列.定义一个函数 F = f(ꭓ) , 对于不同的 ꭓ ,得到不同的 f(ꭓ) [标:不完全一定,会有不同的ꭓ,得到相同的f(ꭓ)情况,术语叫哈希碰撞], 查找的时候,将要查找的key,也按照定义好的哈希函数转换 得到一个哈希值,然后用这个哈希值,直接去哈希表中取,取出则为找出key,取不出即为查找的key不存在.

来看看哈希思想的几个应用:

面试题一:

判断 8 是否存在数组[1,3,5,7,11,13,17]中.

3708877c9995dca0c13f3deeffc37550.png

普通青年

但是这种方式,每查找一次,都要整个的遍历一次.来看看下面的方法:

40142882cfa342940728a2e100a5f2e2.png

文艺青年

可以看到,只要 hash 表建立成功后,每次判断一个数是不是在数组中,只需要直接执行 arrHashObject[key] 就可以得到结果了.效率大大提高.

面试题二:

当 usertype=1 时, userTypeName 为 student,

当 usertype=2 时, userTypeName 为 teacher,

当 usertype=3 时, userTypeName 为 admin,

请用代码描述.

25f44d718117e009b46ffc5e8edc5a3b.png

普通青年

但是这种写法,当条件增多的情况,简直就是灾难.我们可以使用哈希的思想,写得文艺一点:

412b8aeb73321ea190ce3dd13a842a8e.png

文艺青年

增加角色,只需配置这个哈希表,避免了繁琐的 if-else.

面试题三:

需要对存储大量的 URL,并需要根据URL 进行搜索查找.

普通青年: 使用 B-Tree来存储 URL, 会有如下查询:

select id from url where url = 'http://www.mysql.com';

文艺青年: 删除原来 URL 上的索引,新增一个被索引的 url_crc列,使用 CRC32做哈希,就可以使用下面的方式查询:

select id from url where url = 'http://www.mysql.com'  and url_crc = CRC32('http://www.mysql.com');

性能 biu 的一下就上去了,占的空间还不大.

还有在 APP 开发中,我们通常使用 token 来模拟 session 以判断是否用户登录. 大概思路是: 将 将 token 存入到 redis 中. 然后直接使用 Redis->get(token) 看值是否为空来判断是否登录...

有同学要问了, 哈希查找这么好,那有缺点没有?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值