哈希函数&哈希表

1、哈希函数:传入一个字符串返回一个哈希码 数字0~9,字母a~f,长度为16或者32;

这就是哈希函数,mD5哈希。16^16范围。

哈希函数又叫散列函数,

性质:1.输入域是无限的;2.输出域是有限的;3.当你输入参数是固定,输出的哈希也是固定,样本一旦固定,返回值一定的;4.当输入不一样,有可能输出一样的哈希码,这就是哈希碰撞;5.(最重要) 虽然存在多个输入对应一个输出,但是给我很多的输入把,会在输出域上均匀分布,这就是哈希的离散性。

哈希函数特征:1.和输入的规律无关,打乱输入规律,目的就是均匀。

哈希函数性质推广:每一个输入通过哈希函数得到输出,再将每一个输出%m, 推论:输出在输出域均匀分布,在模完之后的域0~m也是均匀分布

 

工程中用到:需求:现在需要1000个不同的哈希函数,如何用一个哈希函数改出1000个,每个哈希函数不相关,

答:比如现在给我的是一个2^64,16个字节大小的输出域的哈希函数,我将前8位与后8位拆开h1、h2,用h1,h2组合生成其它。看似有关系,其实已经无关了。能这样做的原因是哈希码每个位也是相互独立的。也可以用两个哈希函数这么做。

 

哈希函数内部实现细节:一连串的异或和组合,各个位都无关系。MD5的code

 

2、哈希表:

1.哈希表的经典结构:假设现在有17位的哈希表,put(key,value)实现细节:key通过哈希函数得到哈希code,哈希code%17得到0~16中一个,假设为10,将key和value挂在10位,遇到重复冲突的,比如key2,val2 挂的位也是10,怎么算?:第一步,在10位查找有没有key2这个值,如果有,用新val2替换原val,第二步,没有key2存在,则将key2,val2以链表的形式挂在其他值后面

2.哈希表扩容:当发现链表的长度到达某个邻界值,所有位上的链表长度应该差不多,这时将哈希表扩容,比如由17位变成104位,扩容方法:将原哈希表每一个点拿出来重新算,模104,重新分配放入新表中,完成扩容。

问:扩容代价不高吗?如果保证O(1)?

答:每次扩一倍,扩到长度n需要logN次,如果每一次扩五倍 平均扩容代价才log5N。一次扩容可以用很久。并且,还可以离线扩容,不占用用的时间,jvm不用单链表,用红黑树。

 

3、例题:假设一个大文件100T,每一行是一字符串,需求:把重复的字符串打印出来。

答:通过哈希来分流。第一,问能有多少台机器?答有1000台,将这一千台编号0~999

第二,问面试官大文件存哪?答存在一个分布式文件系统上。

第三,问读数据快吗?答快。

好,思路就是:每一行字符串读出来,通过哈希函数得到哈希码,再摸1000,将不同文件分到不同机器,将大文件分到不同机器上,相同的文本一定分到一台机器上。这样的话,假设不同的字符串种类一共有m个,这m个将均匀分配,意思就是每一台机器拥有的种类数量差不多。(注意文件数量不一定均匀),然后在每一台机器运行,如果还太多,再多线程并行。核心就是哈希函数做分流。大数据题目就用哈希函数来处理。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值