哈希函数
又叫做散列函数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是布隆过滤器大小, P是期望失误率, n是样本
确定哈希函数个数K
失误率
抗压服务器
一致性哈希结构降低数据迁移代价,同时负载均衡。
虚拟节点技术 + 哈希 = 分子的热运动,均衡分布。