哈希函数输入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效率低,存放的数据就设置少一点