哈希函数介绍及应用

本文探讨了哈希函数的基本原理及其在大数据处理中的关键作用,包括如何通过哈希函数实现数据的均匀分布和去重,以及在布隆过滤器和抗压服务器中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈希函数

又叫做散列函数f: x -> y, 理论上输入域x是无穷的并且远远大于输出域y,每一个输入对应一个固定的输出,所以一定会存在多个输入对应一个输出。除此之外,哈希函数有一个非常重要的性质,所有的输入是均匀分配在输出上的,或者说每个输入出现在输出位置之间是相互独立的。应用这个性质,哈希函数还可以打乱输入顺序。

从数学的角度看,找到一个函数使得每一个输出位置对应的输入是独立的,可以理解为每一个位置都拥有一个独立的哈希函数,而且是均匀分布的。

如何由一个哈希函数产生多个独立的哈希函数?

已知著名的哈希函数H,我们H产生的输出进行切分,再将前半部分的结果H1和后半部分的结果H2进行线性组合,这样产生的新的哈希函数之间都是相互独立。

 

哈希表

输入一个(key,value)对,对key计算哈希值然后mod一个size(mod过后可以确定哈希表的大小为size - 1),然后将该key value pair存储到相对应的位置(经典的是链表形式,哈希值相同的往后挂),当存储的容量使得查询变慢的时候,需要进行扩容操作(将所有的pair重新计算一遍哈希值然后mod一个更大的size再进行存储,为什么不直接建立一个新的哈希表直接放进去?因为不知道如何对应)。就算经过均摊也无法认为是O(1),因为扩容操作可以离线进行,所以在生产中可以认为是O(1)的。

JVM中是数组加红黑树实现的,key放在红黑树里面。

 

 

举个散列函数在大数据中的应用的例子。将大任务变成小任务。

比如说要对100TB的文件中进行去重整理,单核是不可能完成的,一定要借助于多台机器去完成。那么如何保证同样的字符串可以分配到一台电脑上呢。根据哈希函数的性质,同样的输入必定对应着同样的输出,不同输入均匀分布,这样就可以完成数据的分类。比如我由1000太机器,对每个字符串求个哈希值然后mod1000,根据结果分配到对应的机器上。

 

布隆过滤器: 将大内存限制成小内存

场景:爬虫去重和黑名单问题

流程:

确定布隆器大小m

 m = -\frac{n * lnP}{(ln2)^{2}} , m是布隆过滤器大小, P是期望失误率, n是样本

确定哈希函数个数K

K = ln2 * \frac{m}{n}

失误率  

(1 - e^{-\frac{nK}{m}})^{K}

 

抗压服务器

一致性哈希结构降低数据迁移代价,同时负载均衡。

虚拟节点技术 + 哈希 = 分子的热运动,均衡分布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值