hash,bloomfilter,分布式一致性hash

EndNote20保姆级安装教程:从下载到汉化一步到位(附闪退解决方案) 本文提供EndNote20的详细安装与汉化教程,涵盖系统准备、分步安装、路径优化及闪退解决方案。针对科研人员的需求,特别优化了中文环境下的使用体验,确保文献管理工具的高效稳定运行。 阅读详情

场景

  • 使用word 文档时,判断某个单词是否拼写正确

  • 垃圾邮件过滤算法

  • Redis缓存穿透

  • bitcoin core中交易校验

需求

从海量数据中查询某个字符串是否存在?

平衡二叉搜索树

增删改查时间复杂度是O(log2n)

平衡的目的是保证操作的时间复杂度稳定,保证下次搜索能够稳定排除一半的数据。

O(log2n)的直观理解:100万个节点,最多比较20次;10亿个节点,最多比较30次。

总结:通过比较保证有序,使用二分查找,通过每次排除一般的元素达到快速索引的目的。

散列表(HashMap)

根据key计算key在hash map数组中的位置的数据结构。

hash函数

映射函数 Hash(key)=addr;hash 函数可能会把两个或两个以上的不同 key 映射到同一地址,这种情况称之为冲突(或者 hash 碰撞);

hash 函数实现过程当中 为什么 会出现 i*31?

i * 31 = i * (32-1) = i * (1<<5 -1) = i << 5 - i;可以将乘法转换为位运算,速度快。

31是质数,hash 随机分布性是最好的。

选择hash函数

计算速度快

强随机分布(等概率、均匀地分布在整个地址空间)

murmurhash1,murmurhash2,murmurhash3,siphash(redis6.0当中使⽤,rust等大多数语言选用的hash算法来实现hashmap),cityhash 都具备强随机分布性

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

负载因子

负载因子 = 数组存储元素的个数 / 数据长度

用来形容散列表的存储密度;负载因子越小,冲突越小,负载因子越大,冲突越大;

冲突处理

链表法

引用链表来处理哈希冲突;也就是将冲突元素用链表链接起来;这也是常用的处理冲突的⽅式;但是可能出现一种极端情况,冲突元素比较多,该冲突链表过长,这个时候可以将这个链表转换为红黑树;由原来链表时间复杂度O(n) 转换为红黑树时间复杂度O(log2n);那么判断该链表过长的依据是多少?可以采⽤超过 256(经验值)个节点的时候将链表结构转换为红黑树结构;

开放寻址法

将所有的元素都存放在哈希表的数组中,不使用额外的数据结构;一般使用线性探查的思路解决。

布隆过滤器

是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在。

布隆过滤器不存储具体数据,所以占用空间小,查询结果存在误差,但是误差可控,同时不支持删除操作。为什么不用HashMap

key映射到HashMap 的数组,然后可以在 O(1) 的时间复杂度内返回结果,效率也非常高。

HashMap的问题:size增加,内存占用比较大

测试结果:

unordered_map<string, bool> mp;

main_key=“https://www.alibaba.com/”

sub_key=to_string(i);

Key = main_key+sub_key;

​二叉树也跟hashmap类似,而且还需要比较字符串,不适用于海量数据中字符串的查找。

而bloomfilter,不比较字符串,不存储具体的元素,可以查询海量数据。

Bloomfilter构成

布隆过滤器是一个bit 数组(bitmap) + n个hash函数

m % 2n = m & (2n - 1)

​原理

布隆过滤器的原理是,当一个元素被加入bitmap时,通过K 个 Hash 函数将这个元素映射成bitmap中的 K 个点,把它们置为 1;检索时,再通过 k 个 hash 函数运算检测bitmap的 k 个点是否都为1; 如果这些点有任何一个不为1,则该key一定不存在; 如果全部为 1 ,则该key 很可能(我们期望存在的概率是多少可以设置) 存在。

​(1) 例如针对值 baidu 和三个不同的哈希函数分别生成了哈希值 1 、 4 、 7 ,则上图转变为

​(2) 再存一个值 tencent,如果哈希函数返回 3 、 4 、 8 的话,图继续变为:

​4这个 bit 位由于两个哈希函数都返回了这个 bit 位,因此它被覆盖了。现在我们如果想查询 alibaba 这个值是否存在,哈希函数返回了 1 、 5 、 8 三个值,结果我们发现 5 这个 bit 位上的值为 0 说明没有任何一个值映射到这个 bit 位上 ,因此我们可以很确定地说 alibaba 这个值不存在。而当我们需要查询 baidu 这个值是否存在的话,那么哈希函数必然会返回 1 、 4 、 7 ,然后我们检查发现这三个 bit 位上的值均为 1 ,那么我们可以说 baidu存在了么?答案是不可以,只能是 baidu 这个值可能存在。会存在误判。

C++后台开发系统学习地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师​

以下学习资料,C++后台开发面试题,教学视频,C++后台开发学习路线图,免费分享有需要的可以自行添加:学习资料群720209036 自取

Bloomfilter为什么不支持删除元素?

在bitmap中每个bit只有两种状态(0 或者 1),一个bit被设置为 1 状态,但不确定它被设置了多少次;也就是不知道被多少个 key 哈希映射而来以及是被具体哪个 hash 函数映射而来;

应用场景

布隆过滤器通常用于判断某个 key 一定不存在的场景,同时允许判断存在时有误差的情况;

常用于解决数据库的缓存穿透问题。

​描述缓存场景,为了减轻数据库(mysql)的访问压力,在 server 端与数据库(mysql)之间加入缓存用来存储热点数据;

描述缓存穿透,server端请求数据时,缓存和数据库都不包含该数据,最终请求压力全部涌向数据库;

数据请求步骤,如图中 2 所示;

发生原因:黑客利用漏洞伪造数据攻击或者内部业务 bug 造成大量重复请求不存在的数据;

解决方案:如图中 3 所示;

应用分析

在实际应用中,该选择多少个 hash 函数?要分配多少空间的位图?预期存储多少元素?如何控制误差?

可以参考https://hur.st/bloomfilter

分布式一致性hash

应用场景

分布式一致性hash最先是用来解决分布式缓存问题的。将数据均衡的分散在不同的服务器中,用来分摊缓存服务器的压力;解决缓存服务器数量变化引起的缓存失效问题。

普通的hash算法在分布式应用中的不足

以前memcached不支持集群,不能够横向扩展,就使用hash将数据均衡分布到多个memcached中。

但是,对于增加节点,就会有问题。

比如,在分布式的存储系统中,要将数据存储到具体的节点上,如果我们采用普通的hash算法进行路由,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。

​分布式一致性hash解决数据映射失效问题

分布式一致性hash能解决增加节点,数据映射失效的问题。

把算法固定住,不因为增加节点而变化。不是对节点数量取余,而是对固定的数 2 {32} 取余。

分布式一致性 hash 算法将哈希空间组织成一个虚拟的圆环,圆环的大小是 2 {32} ;

将各个节点使用hash函数进行一个哈希,具体可以选择节点的ip + port作为关键字进行hash,这样每个节点就能确定其在哈希环上的位置。存放数据的时候,使用相同的hash函数,得到key在hash环上的具体位置。根据数据的hash值,去hash环找到第一个大于等于数据hash值的节点,数据存储到该节点。

​分布式一致性hash,对于增加节点,只会影响部分数据映射。对于这个问题,需要通过数据迁移来解决。

hash偏移

hash 算法得到的结果是随机的,不能保证服务器节点均匀分布在哈希环上;分布不均匀造成请求访问不均匀,服务器承受的压力不均匀。导致了数据倾斜问题。

​节点足够多的话, hash具有强随机分布性,数据就会均匀分布。

解决方法:增加虚拟节点。为每一个节点生成多个虚拟节点。

总结

hashmap、bloomfilter和分布式一致性hash都是基于hash函数的。

hashmap用于key-value数据的存储,如C++ stl的unordered_map,redis数据组织等;bloomfilter是一种概率行数据结构,可以确定某个key一定不存在或者可能存在;分布式一致性hash用于分布式缓存系统的负载均衡,并且解决节点变化带来的缓存失效问题。

技术参考

​推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

从零到一:手把手教你用Python搭建医学影像识别CNN模型(附完整代码) 本文详细介绍了如何使用Python和TensorFlow/Keras从零开始构建一个医学影像识别的CNN模型,涵盖数据预处理、模型架构设计、训练调优及部署全流程。通过实战案例和完整代码,帮助开发者快速掌握深度学习在医学影像识别中的应用,特别适合医疗AI领域的初学者和研究者。 阅读详情

相关推荐

PVE(Proxmox VE)添加VMware Esxi并迁移虚拟机

跨平台迁移虚拟机:从VMware虚拟化平台迁移虚拟机到PVE平台。

VEGETA的博客 7711

数据结构与算法:Bloom Filter(布隆过滤器)解决大数据查重问题

在内存有所限制的情况下(如上面的面试问题),快速判断一个元素是否在一个集合(容器)当中,还可以使用。布隆过滤器到底是个什么东西呢?

Sauron7i的博客 1508

FAST-LIO2实战:如何在无人机上部署并实现厘米级定位(附ROS配置全流程)

本文详细介绍了如何在无人机上部署FAST-LIO2激光雷达惯性里程计系统,以实现厘米级精确定位。内容涵盖从硬件选型(如激光雷达与机载计算机)、软件环境配置(ROS Noetic)、传感器标定,到FAST-LIO2参数调优、与PX4飞控集成以及实际飞行测试的全流程。重点解决了实时定位中的外参标定、数据同步等关键问题,为无人机在无GPS或复杂光照环境下提供稳定可靠的定位解决方案。

weixin_29062865的博客 248

海量数据去重的hash与BloomFilter

本文总结了hash的相关应用,仅供参考

m0_63668614的博客 761

ADS1220 STM32硬件SPI驱动程序

前一段时间温故了下标准库,使用的是F1系列芯片,测试程序。

随风飘零翼的博客 5762

YOLOv8中Bottleneck模块详解

Bottleneck 模块在YOLOv8中的作用是进行特征提取和增强,是网络中的核心构建模块之一。它的主要功能是通过卷积操作来处理输入特征图,并在适当情况下应用残差连接,使得信息能够有效地通过网络层进行传播

zzzyyy8的博客 8059

程序员的算法课(14)-Hash算法-对海量url判重

前面给大家讲了哈希表(散列)这种数据结构,那么使用哈希表来解决实际问题,那就是Hash算法了,我们一起来看看。 一、Hash算法的概念 Hash算法(Hash Algorithm),简称散列算法,也成哈希算法(英译),是将一个大文件映射成一个小串字符。与指纹一样,就是以较短的信息来保证文件的唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。 举个列子: 服务器存了1...

十步杀一人-千里不留行 2606

四旋翼滑模控制:从理论到Simulink实现

本文深入探讨了四旋翼滑模控制的理论与Simulink实现,对比了其相较于PID控制在抗干扰和鲁棒性方面的显著优势。文章详细介绍了从精确动力学建模、内外环滑模控制器设计到指令解算的完整流程,并分享了Simulink仿真搭建、参数调试及抗扰性能验证的实战经验,帮助工程师掌握在复杂环境下提升四旋翼稳定性的进阶技能。

weixin_29163581的博客 375

海量数据处理之Bloom Filter详解

海量数据处理之Bloom Filter详解 前言 本博客内曾已经整理过十道海量数据处理面试题与十个方法大总结。接下来,本博客内会重点分析那些海量数据处理的方法,并重写十道海量数据处理的面试题。如果有任何问题,欢迎不吝指正。谢谢。 一、什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属...

jinghuainfo 1052

第1章:认识OpenClaw

OpenClaw是一个开源的 AI 智能体 Gateway 网关项目名称演变:OpenClaw 原名 Clawdbot,因 Anthropic 商标顾虑在 2026年1月27日更名为 Moltbot(过渡名),最终在1月30日确定为 OpenClaw。三个名字本质是同一个项目,功能完全一致。🏠在你的电脑上运行:完全本地部署,数据隐私有保障📁访问本地文件:可以搜索、读取、编辑你电脑上的文件🔌扩展能力:通过Skills(技能)系统无限扩展功能💬多平台使用。

Maynor的博客 2829

【第48例】BLM模型之市场洞察-五看工具篇(一)

BLM市场洞察

产品线负责人 2106

实例学习Bloom Filter

0. 科普1. 为什么需要Bloom Filter2. 基本原理3. 如何设计Bloom Filter4. 实例操作5. 扩展   0. 科普       Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。   1. 为什么需要Bloom Filter      ...

weixin_34248487的博客 498

Python re库【正则表达式操作库】全面讲解及代码示例

以下是Pythonre库的全面讲解,包含主要功能、常用方法及代码示例。完整代码和注释附后。正则表达式(Regular Expression)是用于匹配、查找、替换字符串的工具,通过特定语法定义模式。?{n}[...][a-z]A|B\d[0-9]\D\s\S\w\Wre从字符串匹配模式,返回Match对象或None。在字符串中第一个匹配项,返回Match对象或None。返回所有匹配项的。返回所有匹配项的Match对象)。替换匹配项,返回新字符串。根据模式分割字符串,返回列表。通过。

记录点滴 1160

数据结构 Hash,哈希冲突,哈希聚集,BloomFilter,分布式一致性hash

Hash、布隆过滤器、哈希一致性

black101的博客 1204

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

海量数据去重的Hash、bitmap、BloomFilter、分布式一致性hash

布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在;优缺点:布隆过滤器相⽐传统的查询结构(例如:hash,set,map等数据结构)更加⾼效,占⽤空间更⼩,但是确定是它返回的结果是概率性的,结果存在一定的误差,误差可控,同时不支持删除操作构成:位图(bit数组)+ n个hash函数。

qq_29750559的博客 1798

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

海量数据去重的Hash与BloomFilter,bitmap,分布式一致性hash

布隆过滤器是由位图和k个hash函数构成的有时,我们不需要通过key查找特定的value,只是想确定某个key是否存在,又或是为了节省内存,可以使用布隆过滤器。

量变产生质变 694

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c/c++后台开发学习笔记 1.1.3 海量数据去重的Hash,BloomFilter,bitmap

背景 判断单词拼写是否正确 判断垃圾邮件 url去重 缓存穿透问题(访问不存在的元素会穿透redis缓存而始终访问mysql,造成mysql压力过大) 需求 海量数据中查询某个字符串是否存在 平衡二叉树 红黑树、AVL,b/b+树, 跳表 时间复杂度是O(log2(n)) 10亿节点最多比较30次 散列表(哈希表) 根据key计算在表中存储的位置 hash函数 Hash(key)–>addr; 两个key被隐射到一个地址称为冲突 负载因子:数据储存元素个数/数据长度 (越小冲突越小) 冲突处理

jsc723的专栏 1083

js-stl高级数据结构:跳表、布隆过滤器与一致性哈希详解

在现代JavaScript开发中,高效的数据结构是构建高性能应用的基础。GitHub加速计划下的js-stl项目(Data structures implemented in JS)提供了丰富的JavaScript数据结构实现,其中跳表、布隆过滤器和一致性哈希作为高级数据结构,在处理大规模数据和分布式系统中展现出独特优势。本文将深入解析这三种数据结构的原理、应用场景及在js-stl中的实现方式,帮

gitblog_00874的博客 392

谈谈处理海量数据的数据结构-——Hash与BloomFilter

而hash算法的思想是先将元素通过hash函数进行一个区间映射,对元素样本进行拆分,缩小了某一元素查找的样本量,在进行区间类的元素比较,从而确定该样本有该元素。siphash( redis6.0 当中使用,rust 等大多数语言选用的 hash 算法来实现 hashmap,sipHash的设计考虑了安全性和性能之间的平衡,既能够提供足够的安全性,又能够在大多数应用场景下保持高速的计算速度。高可用性:当节点发生故障或增加时,只需调整少量的虚拟节点映射关系,不会导致大规模的数据迁移,从而提高了系统的可用性。

weixin_70084230的博客 283

专科生阿里大数据一面面经「已过」「附详细答案」

这篇文章是我学习群里一个小兄弟的面试总结,他是专科大三,很早之前找我指导了学习路线,学习很认真努力,目前他已经过了阿里一面。在征求他同意的之后发我公众号上面,答案经过我重...

a934079371的博客 572

2022年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库,看到就是赚到。

互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....) 话不多说,上干货!!! 助你在这次金九银十中大放光彩,更进一步! 分布式 一、大型网站系统的特点 二、大型网站架构演化发展历程 三、拆分VS集群 四、微服务VS SOA 五、前后端完全分离与Rest规范 六、CAP三进二和Base定理关系型数据库遵循ACID规..

m0_67322837的博客 302

基于redis分布式缓存实现

简单说明下,写此文章算是对自己近一段工作的总结,希望能对你有点帮助,同时也是自己的一点小积累。一.为什么选择redis在项目中使用redis做为缓存,还没有使用memcache,考虑因素主要有两点:1.redis丰富的数据结构,其hash,list,set以及功能丰富的String的支持,对于实际项目中的使用有很大的帮忙。(可参考官网redis.io)2.redis单点的性能...

weixin_34270865的博客 69

RocketMQ高可用架构与高级特性

HA 架构:通过 DLedger/Raft 解决了自动故障转移的难题。事务消息:通过 Half Message + 回查机制,优雅地解决了分布式数据一致性问题。延时消息:通过“Topic 替换 + 简化的时间轮”思想,在性能和功能间取得了平衡。过滤机制:通过 Broker/Client 两级过滤及 BloomFilter 优化,保证了投递的精准与高效。

TracyCoder的博客 722

Cassandra

Cassandra知识点

ITWUYI的博客 1286

Canssandra

1. 概念 Apache Cassandra 是高度可扩展的,高性能的分布式 NoSQL 数据库。 Cassandra 旨在处理许多商品服务器上的大量数据,提供高可用性而无需担心单点故障。 2. 数据模型 Key Space(对应 SQL 数据库中的 database) 一个 Key Space 中可包含若干个 CF,如同 SQL 数据库中一个 database 可包含多个 table Key(对应 SQL 数据库中的主键) 在 Cassandra 中,每一行数据记录是以 key/value 的形式存

m0_53080414的博客 683
上一篇: Reactor实现http服务器,附完整代码
下一篇: DPDK技术系统学习一(接收,发送,arp,icmp功能测试)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值