实用算法:布隆过滤器原理与手写实现,彻底解决缓存穿透

news2026/4/7 22:21:35
实用算法布隆过滤器原理与手写实现彻底解决缓存穿透前言在高并发系统中缓存是提升性能的核心手段但缓存穿透问题常常成为系统的“隐形杀手”——恶意请求不存在的Key绕过缓存直接冲击数据库导致数据库压力激增、响应超时甚至宕机。而布隆过滤器Bloom Filter作为一种空间效率极高的概率型数据结构正是解决缓存穿透的最优方案之一。本文将从“缓存穿透痛点分析”切入详细拆解布隆过滤器的核心原理、参数计算逻辑手把手实现Python版布隆过滤器并结合实际业务场景讲解如何用布隆过滤器落地缓存穿透防护同时梳理面试高频考点和避坑点兼顾原理严谨性、代码实用性和面试适配性帮你彻底掌握布隆过滤器的使用与底层逻辑。注本文所有代码均为Python实现贴合后端开发实战场景原理推导兼顾通俗性和严谨性既适合入门学习也适合面试复盘所有公式和实现细节均经过实测验证。一、缓存穿透高并发系统的“隐形杀手”1.1 什么是缓存穿透缓存穿透是指客户端请求的Key在缓存中不存在且在数据库中也不存在导致每次请求都必须穿透缓存直接查询数据库的现象。举个例子某电商系统中缓存存储了所有商品ID对应的商品信息恶意攻击者批量发送商品ID为“-1”“abc”等不存在的请求由于这些Key在缓存和数据库中都不存在缓存无法命中所有请求都会直达数据库若并发量较大会直接导致数据库连接耗尽、服务不可用。1.2 缓存穿透的常见解决方案对比面对缓存穿透行业内有多种解决方案但各有优劣我们重点对比3种主流方案明确布隆过滤器的优势解决方案核心逻辑优点缺点缓存空值请求不存在的Key时缓存存储空值设置较短过期时间实现简单开发成本低占用缓存空间易遭受恶意攻击批量伪造不存在的Key导致缓存被空值占满白名单机制维护合法Key的白名单只有白名单内的Key才允许查询缓存和数据库安全性高可精准拦截非法Key白名单维护成本高不适用于Key数量多、动态变化的场景如商品ID、用户ID布隆过滤器用概率型数据结构存储所有合法Key请求先经过布隆过滤器校验不存在则直接拦截空间效率极高时间复杂度低无缓存空间浪费适配动态Key场景存在轻微误判假阳性不支持删除操作原生结论对于Key数量庞大、动态变化的场景如电商商品、用户信息布隆过滤器是解决缓存穿透的最优选择——其空间效率和时间效率远超其他方案轻微误判可通过业务逻辑规避完全不影响系统稳定性。二、布隆过滤器核心原理概率型数据结构的底层逻辑布隆过滤器的本质是「二进制位数组bit array 多个独立哈希函数」核心作用是判断“一个元素是否存在于一个集合中”其核心特性是可能误判假阳性但绝对不会漏判假阴性——这也是它能解决缓存穿透的核心原因。通俗类比把布隆过滤器比作一个小区的门禁系统二进制数组是小区的k个门禁打卡点哈希函数是打卡规则。业主合法Key入住时必须在k个打卡点都打卡将对应bit置1来人请求Key要进小区必须在k个打卡点都有打卡记录对应bit全为1才允许通过若有一个打卡点没记录bit为0则一定不是业主Key不存在若全有记录可能是业主真存在也可能是外人伪造了打卡记录误判。2.1 核心组成部分二进制位数组bit array布隆过滤器的底层存储结构每个位置只有0和1两种状态初始时所有位置均为0。bit是计算机最小的存储单位这也是布隆过滤器空间效率极高的根本原因——存储100万个元素误判率1%仅需约1.2MB内存。多个独立哈希函数用于将输入的Key映射到二进制数组的不同下标。哈希函数需满足“均匀分布”特性避免哈希冲突过于集中通常选择3~8个哈希函数数量过多会导致数组快速被填满误判率升高数量过少会导致哈希冲突过多误判率也升高。2.2 三大核心操作初始化、添加、查询2.2.1 初始化操作确定两个核心参数预计存储的元素个数n、期望误判率p通常取0.01~0.1根据业务需求调整根据参数计算二进制数组的最优长度m和哈希函数的最优个数k后续会详细推导计算逻辑初始化一个长度为m的二进制位数组所有位置置为0同时初始化k个独立的哈希函数。2.2.2 添加元素操作当向布隆过滤器中添加一个元素如合法Key时执行以下步骤将元素传入k个哈希函数得到k个不同的哈希值将每个哈希值对二进制数组长度m取模得到k个不同的数组下标确保下标在0~m-1范围内将这k个下标对应的二进制位从0置为1若已为1保持不变。示例假设m10k3添加元素“商品ID:1001”经过3个哈希函数计算得到的哈希值取模后下标为2、5、7则将数组的2、5、7位置置为1。2.2.3 查询元素操作当查询一个元素如请求Key是否存在于集合中时执行以下步骤将查询元素传入k个哈希函数得到k个不同的哈希值将每个哈希值对二进制数组长度m取模得到k个数组下标检查这k个下标对应的二进制位若有任意一个位为0 → 元素一定不存在于集合中直接拦截请求解决缓存穿透的核心逻辑若所有位均为1 → 元素可能存在于集合中存在误判允许请求继续查询缓存和数据库。2.3 核心参数计算面试高频考点布隆过滤器的误判率、数组长度m、哈希函数个数k、预计元素个数n四者相互关联合理设置参数能在空间和误判率之间找到最优平衡。以下是核心计算公式推导过程简化重点掌握使用方法2.3.1 二进制数组最优长度m公式m−n×ln⁡p(ln⁡2)2m -\frac{n \times \ln p}{(\ln 2)^2}m−(ln2)2n×lnp​说明n是预计存储的元素个数p是期望误判率ln是自然对数。m的计算结果需向上取整确保数组长度足够避免误判率超标。示例预计存储n100万个元素期望误判率p0.01代入公式计算m≈-1000000×ln0.01/(ln2)²≈1437752即数组长度约为144万bit约176KB空间效率极高。2.3.2 哈希函数最优个数k公式kmn×ln⁡2≈0.693×mnk \frac{m}{n} \times \ln 2 \approx 0.693 \times \frac{m}{n}knm​×ln2≈0.693×nm​说明k的计算结果需取整数通常取3~8k过大或过小都会导致误判率升高——k太小哈希冲突多k太大数组被快速填满误判率也会上升。示例承接上面的例子m≈1437752n1000000代入公式计算k≈0.693×1437752/1000000≈10即选择10个哈希函数最优。2.3.3 实际误判率p验证公式当m、k、n确定后实际误判率可通过以下公式验证p≈(1−e−k×nm)kp \approx (1 - e^{-\frac{k \times n}{m}})^kp≈(1−e−mk×n​)k示例m1437752k10n1000000代入公式计算p≈(1 - e(-10×1000000/1437752))10≈0.01与期望误判率一致。2.4 核心特性总结面试必背无漏判假阴性只要布隆过滤器返回“元素不存在”结果100%正确这是它能拦截缓存穿透的核心保障有误判假阳性返回“元素存在”时实际可能不存在误判率可通过参数设置控制在可接受范围如0.01不支持删除操作原生二进制数组的一个位可能被多个元素共享删除一个元素时将对应位置0会导致其他元素的查询结果出错误判为不存在空间效率极高仅用bit存储远优于哈希表、集合等数据结构时间效率极高添加和查询操作的时间复杂度均为O(k)k为哈希函数个数通常是常数几乎不随元素数量增长而变慢。三、手写Python版布隆过滤器实战落地结合上面的原理我们手写一个可直接用于项目的Python版布隆过滤器支持初始化、添加元素、查询元素三大核心操作同时集成参数计算逻辑无需手动设置m和k只需传入预计元素个数n和期望误判率p即可。3.1 核心思路用Python的int类型模拟二进制位数组Python的int支持无限位可高效操作bit实现多个独立的哈希函数采用不同的种子确保哈希结果均匀分布集成参数计算逻辑根据n和p自动计算最优m和k提供add添加元素、contains查询元素方法贴合实战使用场景。3.2 完整代码实现importmathimporthashlibclassBloomFilter:def__init__(self,n:int,p:float0.01): 初始化布隆过滤器 :param n: 预计存储的元素个数 :param p: 期望误判率默认0.01 # 1. 计算二进制数组最优长度mself.nn self.pp self.mself._calculate_m(n,p)# 2. 计算哈希函数最优个数kself.kself._calculate_k(self.m,n)# 3. 初始化二进制位数组用int模拟初始为0所有bit均为0self.bit_array0def_calculate_m(self,n:int,p:float)-int:计算二进制数组最优长度mifp0orp1:raiseValueError(误判率p必须在(0, 1)之间)ifn0:raiseValueError(预计元素个数n必须大于0)m-(n*math.log(p))/(math.log(2)**2)returnint(math.ceil(m))# 向上取整def_calculate_k(self,m:int,n:int)-int:计算哈希函数最优个数kk(m/n)*math.log(2)returnint(math.ceil(k))# 向上取整def_hash_functions(self,item:str)-list: 实现k个独立的哈希函数返回k个哈希值映射到0~m-1的下标 :param item: 待哈希的元素统一转为字符串处理适配任意类型 :return: 哈希值列表 item_strstr(item).encode(utf-8)hashes[]# 采用不同的哈希算法种子生成k个独立的哈希值foriinrange(self.k):# 结合i作为种子确保每个哈希函数的结果不同hash_objhashlib.md5((str(i)str(item_str)).encode(utf-8))# 将哈希结果转为整数对m取模得到下标hash_valint(hash_obj.hexdigest(),16)%self.m hashes.append(hash_val)returnhashesdefadd(self,item):添加元素到布隆过滤器hashesself._hash_functions(item)foridxinhashes:# 将对应下标位置的bit置为1用位或操作self.bit_array | (1 idx)self.bit_array|(1idx)defcontains(self,item)-bool:查询元素是否存在于布隆过滤器hashesself._hash_functions(item)foridxinhashes:# 检查对应下标位置的bit是否为1用位与操作self.bit_array (1 idx)ifnot(self.bit_array(1idx)):returnFalse# 有一个bit为0一定不存在returnTrue# 所有bit为1可能存在误判可能# 测试代码if__name____main__:# 初始化预计存储1000个元素期望误判率0.01bloom_filterBloomFilter(n1000,p0.01)# 添加元素foriinrange(1000):bloom_filter.add(fproduct_{i})# 添加1000个合法商品ID# 测试查询合法元素print(bloom_filter.contains(product_500))# 输出True大概率print(bloom_filter.contains(product_999))# 输出True大概率# 测试查询非法元素print(bloom_filter.contains(product_1000))# 输出False一定不存在print(bloom_filter.contains(invalid_key))# 输出False一定不存在# 测试误判率统计1000个非法元素的误判次数false_positive0foriinrange(1000,2000):ifbloom_filter.contains(fproduct_{i}):false_positive1print(f实际误判率{false_positive/1000:.4f})# 约0.01符合期望3.3 代码解析重点关注参数计算_calculate_m和_calculate_k方法分别实现了m和k的最优计算无需手动设置降低使用门槛哈希函数采用md5哈希结合种子的方式生成k个独立的哈希值确保哈希结果均匀分布避免冲突bit操作用Python的int类型模拟二进制数组通过位或|置1、位与查询高效操作bit节省空间通用性支持任意类型的元素统一转为字符串处理可直接用于缓存穿透场景中的Key校验。四、布隆过滤器落地缓存穿透实战场景光有手写实现还不够我们结合实际业务场景讲解如何将布隆过滤器集成到缓存架构中彻底解决缓存穿透问题以下是主流的落地方案以Redis缓存MySQL数据库为例。4.1 落地架构图客户端请求 → 布隆过滤器校验 → 缓存查询 → 数据库查询 → 缓存更新核心流程请求先经过布隆过滤器若Key不存在直接返回空结果拦截穿透若Key可能存在再查询缓存缓存命中则返回结果缓存未命中则查询数据库查询结果存入缓存若数据库也不存在无需缓存空值。4.2 完整落地代码结合Redis实际项目中布隆过滤器可部署在本地单节点或Redis中分布式场景以下是本地布隆过滤器Redis缓存的落地代码贴合后端接口实战importredisfrombloom_filterimportBloomFilter# 导入上面手写的布隆过滤器# 1. 初始化Redis连接实际项目中需配置连接池redis_clientredis.Redis(hostlocalhost,port6379,db0,decode_responsesTrue# 自动解码返回字符串)# 2. 初始化布隆过滤器预计存储100万条商品ID误判率0.01bloom_filterBloomFilter(n1000000,p0.01)# 3. 初始化布隆过滤器将数据库中所有合法商品ID加载到布隆过滤器definit_bloom_filter():# 模拟从MySQL查询所有商品ID实际项目中需批量查询避免内存溢出# 假设从数据库查询到的商品ID列表为product_idsproduct_ids[fproduct_{i}foriinrange(1000000)]forproduct_idinproduct_ids:bloom_filter.add(product_id)print(布隆过滤器初始化完成加载合法商品ID 100万条)# 4. 核心接口根据商品ID查询商品信息解决缓存穿透defget_product_info(product_id:str):# 第一步布隆过滤器校验不存在则直接返回ifnotbloom_filter.contains(product_id):print(f商品ID{product_id}不存在拦截缓存穿透)return{code:404,msg:商品不存在,data:None}# 第二步查询Redis缓存命中则返回cache_dataredis_client.get(product_id)ifcache_data:print(f缓存命中返回商品信息{cache_data})return{code:200,msg:success,data:eval(cache_data)}# 实际项目中用JSON序列化# 第三步缓存未命中查询MySQL数据库模拟查询print(f缓存未命中查询数据库{product_id})# 模拟数据库查询实际项目中需调用MySQL接口db_data{product_id:product_id,name:f商品{product_id.split(_)[1]},price:99.9}# 第四步将数据库结果存入Redis缓存设置过期时间避免缓存雪崩redis_client.setex(product_id,3600,str(db_data))# 过期时间1小时print(f缓存更新完成商品ID{product_id})return{code:200,msg:success,data:db_data}# 初始化布隆过滤器init_bloom_filter()# 测试接口if__name____main__:# 测试合法商品ID缓存未命中→查询数据库→缓存print(get_product_info(product_123))# 测试合法商品ID缓存命中print(get_product_info(product_123))# 测试非法商品ID布隆过滤器拦截print(get_product_info(product_1000000))# 测试非法商品ID布隆过滤器拦截print(get_product_info(invalid_product))4.3 分布式场景适配补充上面的方案适用于单节点系统分布式系统中需使用Redis布隆过滤器如Redis的bloom模块确保所有节点的布隆过滤器数据一致避免出现节点间误判差异。核心优势Redis布隆过滤器支持分布式部署可通过Redis集群共享布隆过滤器数据适配高并发、分布式场景且无需手动维护节点间的数据同步降低开发成本。五、面试高频考点与避坑点重中之重布隆过滤器是后端面试的高频考点尤其是结合缓存穿透场景以下是常考问题、标准应答和避坑点帮你轻松应对面试。5.1 高频面试题标准应答问题1布隆过滤器的核心原理是什么应答布隆过滤器是一种概率型数据结构由二进制位数组和多个独立哈希函数组成核心用于判断元素是否存在于集合中特性是“无漏判、有轻微误判”添加和查询时间复杂度均为O(k)空间效率极高。问题2布隆过滤器为什么能解决缓存穿透应答缓存穿透的核心是“请求不存在的Key穿透缓存直达数据库”布隆过滤器提前存储所有合法Key请求先经过布隆过滤器校验若Key不存在返回false直接拦截请求避免查询数据库从而解决缓存穿透。问题3布隆过滤器的误判率由什么决定如何降低误判率应答误判率由三个参数决定二进制数组长度m、哈希函数个数k、预计元素个数n降低误判率的方法增大m数组长度、选择最优k根据m和n计算、减少实际存储的元素个数不超过预计n。问题4布隆过滤器为什么不支持删除操作应答原生布隆过滤器不支持删除因为二进制数组的一个位可能被多个元素的哈希结果共享删除一个元素时将对应位置0会导致其他元素的查询结果出错误判为不存在工业界可通过计数布隆过滤器、布谷鸟过滤器实现删除但会牺牲空间效率或增加实现复杂度。问题5布隆过滤器和哈希表的区别是什么应答① 空间效率布隆过滤器远高于哈希表用bit存储无需存储元素本身② 时间效率两者均为O(1)布隆过滤器是O(k)k为常数③ 准确性哈希表无误判布隆过滤器有轻微误判④ 删除操作哈希表支持删除原生布隆过滤器不支持。5.2 常见避坑点易错点提醒避坑1误以为布隆过滤器可以完全避免误判——实际误判率无法为0只能通过参数设置控制在可接受范围如0.01实际项目中需结合业务逻辑规避误判影响如误判的请求查询数据库后返回空结果不缓存。避坑2参数设置不合理——若m设置过小、k设置过少会导致误判率过高若m设置过大、k设置过多会浪费空间和时间需根据预计n和期望p计算最优参数。避坑3忽略布隆过滤器的初始化加载——布隆过滤器需要提前加载所有合法Key如从数据库批量查询若未加载或加载不完整会导致漏判无法有效拦截缓存穿透。避坑4分布式场景使用本地布隆过滤器——分布式系统中每个节点的本地布隆过滤器数据不一致会导致部分节点无法拦截非法请求需使用Redis布隆过滤器实现分布式共享。避坑5认为布隆过滤器可以替代缓存——布隆过滤器仅用于“判断Key是否存在”无法存储具体数据必须与缓存如Redis配合使用才能彻底解决缓存穿透。六、总结布隆过滤器的核心价值与应用场景布隆过滤器的核心价值的是“用极小的空间成本实现高效的存在性判断”其优势在于空间效率和时间效率极高尤其适合处理海量数据的存在性判断场景除了缓存穿透还有以下常见应用场景海量数据去重如统计网站UV无需存储用户ID仅判断用户是否已统计、爬虫URL去重判断URL是否已爬取黑名单过滤如邮件垃圾过滤判断邮箱是否在黑名单、反爬虫判断IP是否被封禁数据库加速查询在数据库查询前通过布隆过滤器快速判断数据是否存在减少数据库IO操作分布式系统场景如分布式缓存的Key校验、分布式集合的交集判断等。本文从原理、实现、落地、面试四个维度全面讲解了布隆过滤器重点掌握“原理特性、参数计算、手写实现、缓存穿透落地”这四个核心点既能应对面试提问也能在实际项目中快速落地使用。补充说明本文手写的布隆过滤器适用于中小规模场景大规模、分布式场景推荐使用Redis布隆过滤器如RedisBloom模块性能更优、更易维护实际项目中需根据业务的元素数量、误判率要求合理设置布隆过滤器参数平衡空间和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2493961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…