哈希及其应用

使用场景

        word判断单词是否拼写正确

        网络爬虫(不爬相同页面)

        垃圾邮件过滤算法

          大量数据查询某个字符串是否存在

平衡二叉树

        中序遍历有序,增删改查复杂度O(log2n)

        10万条数据最多比较20次,换底公式计算log2n = log10n/log102

        通过比较达到有序,每次排除一半达到快速索引的目的

散列表(hash+数组)

        原理:根据key计算key在表中的位置的数据结构,是key和地址存储位置的映射关系hash(key) = addr

        冲突程度描述:负载因子(0-1)

         冲突处理:a.链表法:而且是通常头插法(局部性原理),极端情况下,使用红黑树来管理这个冲突链表,降O(n)为O(log2n)

                           b.开放寻址法(布隆过滤器使用)一个个的向下查找直到空或者平方勘探法

                           c.双重哈希法(.net使用)与数组size互为质

                                        

布隆过滤器

        概率型数据结构,确定某个字符串一定不存在或者可能存在 不存储具体数据,误差可控,不支持删除操作

        构成:位图+n个hash函数

        原理:位图

检索原理:见下图k个hash函数将字符串映射到k个点,置为1,然后检索时如果都为1那么可能存在,有不为1那么一定不存在,同时不能删除是因为可能将别人置为1的点也置为0导致删掉其他人的

 

 应用场景 判断某个key一定不存在的场景,同时允许判断误差

                例子:缓存穿透的解决,热key限流

                

         缓存穿透场景:攻击者大量访问不存在的数据,缓存和数据库都不存在这个数据,导致所有的请求全部压到mysql数据库

          解决方案:server端加上一个布隆过滤器,将mysql的key全部存到里面

        

应用分析:hash函数个数的选择,分配多少的位图参照下列公式

        n-- 预期布隆过滤器中元素的个数,如上图 只有str1和str2 两个元素 那么 n=2

        p -- 假阳率,在0-1之间

        m -- 位图所占空间

        k -- hash函数的个数

        公式如下:

        n = ceil(m / (-k / log(1 - exp(log(p) / k))))

        p = pow(1 - exp(-k / (m / n)), k)

        m = ceil((n * log(p)) / log(1 / pow(2, log(2))));

        k = round((m / n) * log(2));

hash函数选择

        计算速度快,强随机分布,典型murmurhash2,sipgash(redis6.0当中使用,rust等大度数语言使用)

        siphash主要解决字符串接近的强随机分布性

实际使用布隆过滤器

        确定n和p,算出m和k(直接到相关的网站计算即可)

分布式一致hash

        解决分布式问题

        算法思路:将 2^32的空间映射成一个环

        hash(meachine ip + port)->addr(机器hash值)

        hash(key)->addr(存储键hash值),得到这个存储键hash值后一个个的查找,第一个就是其存储的位置

        

由于hash函数并不保证均匀性,于是加上虚拟节点使得尽量保持hash的均匀性

        

 

        

        

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表(Hash Table),也称为散列表,是一种高效的数据结构,用于存储和查找键值对。它通过将键映射到一个固定大小的数组索引来实现快速的插入、删除和查找操作。 哈希表的核心思想是利用哈希函数将键转换为数组索引。哈希函数接收键作为输入,并生成一个对应的索引值。具有相同索引值的键值对会被存储在数组的同一个位置上,这个位置就是哈希表中的桶(bucket)。当需要查找特定键的值时,再次应用哈希函数即可快速定位到对应的桶,并返回值。 哈希表的主要优点是快速插入、删除和查找操作的时间复杂度通常为O(1)。然而,在某些情况下,由于哈希冲突(不同键对应相同索引),可能会导致性能下降。为了解决哈希冲突,常见的解决方法是使用链表或其他数据结构来处理冲突的元素,形成链地址法或开放地址法。 应用场景: - 缓存:哈希表常用于缓存系统中,可以通过将数据存储在内存中的哈希表中来加快访问速度。 - 数据索引:哈希表常用于构建索引,例如数据库中的索引,可以快速定位和检索数据。 - 字典:哈希表可以用于实现字典,其中键值对可以表示词汇和其对应的定义。 - 唯一性检查:哈希表可以用于检查元素的唯一性,例如在网站用户注册中检查用户名是否已存在。 - 分布式存储:哈希表在分布式系统中被广泛使用,用于数据的分片和路由。 总之,哈希表是一种高效的数据结构,适用于需要快速插入、删除和查找操作的场景。它在各种应用中都发挥着重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值