Hash函数和Hash表

 哈希函数输入in是无穷的,输出out有穷尽的。

下载的电影中的电影名称就是用以下两种方法计算出来的

MD5算法哈希函数输出是0~2的64次方-1每一位是16进制

 SHA1算法范围是2的128次方-1

(4) 离散性:输入的即使相似,但是分布的点也是没有规律的。这样才能保证均匀性

。一个hash函数的离散性越好这个hash函数就越好

hash函数要保证在输出域s上均匀分布而且要在m上做模也均匀分布 

hash表中的索引所占空间我们忽略不计 

 使用hash函数来就解决

 hash表增删改查都是O(1)的。而且每个链表都是均匀增长的

当哈希表太短时,需要对哈希表进行扩充。此时重新计算一遍hash值 在去模34 ,把原来的数重新放入34长度的哈希表

关于hash表的扩容问题。假设链长不超过2.那么加入N个字符串进行扩容就是扩充次数就是O(logN)。如果链的长度长一点。那他的时间复杂度级别也是这个级别。只是稍微低一点

。每次扩容的时间复杂度又是O(N)的。总的扩容代就为O(N*logN) .平均每个数的扩容代价(单次扩容代价)为O(logN) .当链变长,或N比较小时。时间复杂度就是O(1)水平。而且我们在使用hash表时,也会删除,所以一般使用hash表的扩容代价就是O(1)

 JVM的加速hash表效率:采用离线扩容的技术。在使用时不对hash表进行扩容。等不使用再进行扩容。

所以hash表的扩容在使用上的时间复杂度是O(1)的,而理论上是O(logN)的

 hash表的java改进。把链表变成有序树

 我们用变量size表示存储结构的长度。删除的时候,我们就拿最后一个字符串去填洞。这样删除后再random返回就不会有空缺。

 

 对一个黑名单的集合实现两个功能:1.向黑名单中添加元素;2.查询元素是否在黑名单中

 布隆过滤器的实现:可以极大的减少内存的使用量。而且允许一定的错误率

失误的情况只有一种就是本身url不是黑名单,但是却被判断为黑名单。但这种行为的发生可以被优化成万分之一的概率 

做出一个bit类型的数组

 这里的i表示的不是真实位,而是位数组的索引

 

 先确定通过计算算出m的最合适的值,确定m之后,再通过计算可以得出合适数量的哈希函数k

 

 使用分布式存储时,利用hash函数来决定在哪台服务器上存储数据。使得三个数据库负载均衡。为了使数据库负载均衡 。

为了使数据库的负载均衡,使用的key达到高频、中频、低频的数量应该是差不多的。如:把国家当作key高频的只有中美两国。这样就导致不均衡负载

当增加机器,数据需要重新计算hash值,重新分配数据库。因此增加数据库时,数据的迁移是全量的。 

 

 为了降低迁移代价,使用一致性哈希。一致性hash不使用模

 这样做的两个问题:1.机器很少(hash函数的结果只有数值多的时候才会均匀分布)的时候怎么均分 2.增加机器时,怎么做到所有机器负载均衡

解决方法:虚拟节点技术

 当添加添加新机器时,按比例,把一部分数据放到新的机器中。找出hash值属于机器的数据。而且这样做还能对机器做出固定的分配。如:m1号机器效率高,可以多存放数据。m4效率低,存放的数据就设置少一点

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值