零声教育 第11代 Linux C/C++后端服务器架构开发 成长体系课程
零声教育
2021-08-30
零声教育 11代C/C++后端服务器架构开发 成长体系课程大纲 1. 精进基石专栏 2. 高性能网络设计专栏 3. 基础组件设计专栏 1.1 数据结构与算法 1.1.1 随处可见的红黑树 1.1.2 磁盘存储链式的B树与B+树 1.1.3 海量数据去重的Hash与BloomFilter,bitmap 1.2 设计模式 1.3 c++新特性 1.2.1 创建型设计模式 1.2.2 结构型设计模式 1.4 Linux工程管理 1.4.1 Makefile/cmake/configure 1.4.2 分布式版本控制git 1.4.3 Linux系统运行时参数命令 1.3.1 stl容器,智能指针,正则表达式 1.3.2 新特性的线程,协程,原子操作,lamda表达式 2.1 网络编程 2.2 网络原理 2.3 自研框架:协程框架NtyCo的实现 2.1.1 网络io与select,poll。epoll 2.1.2 reactor的原理与实现 2.1.3 http/https服务器的实现 2.1.4 websocket协议与服务器实现 2.2.1 服务器百万并发实现 2.2.2 redis,memcached,nginx网络组件 2.2.3 Posix API与网络协议栈 2.2.4 UDP的可靠传输协议QUIC 2.3.1 协程设计原理与汇编实现 2.3.2 协程调度器实现与性能测试 2.4.1 用户态协议栈设计实现 2.4.2 tcp/ip定时器与滑动窗口 2.4.3 手把手设计实现epoll 3.1 池式组件 3.2 高性能组件 3.3 开源组件 3.1.1 手写线程池与性能分析 3.1.2 内存池的实现与场景分析 3.1.3 异步请求池的实现 3.1.4 mysql连接池的实现 3.2.1 原子操作CAS与锁实现 3.2.2 无锁消息队列实现 3.2.3 定时器方案红黑树,时间轮,最小堆 3.2.4 手写死锁检测组件 libevent/libev框架实战的那些坑 异步日志方案log4cpp 应用层协议设计ProtoBuf/Thrift 4. 中间件开发专栏 5. 开源框架专栏 6. Rust项目专栏 7. 性能分析专栏 8. 分布式架构专栏 9. 上线项目实战 4.1 MySQL 4.3 Redis 4.5 Nginx 4.5 MongoDB 8.1 分布式消息队列 5.1 skynet 5.2 TARS 5.3 DPDK 8.4.1 内核级支持的分布式存储Ceph 8.2.2 注册服务中心Etcd 8.2.1 远程调用brpc 8.4.2 服务容器化Docker 4.2 TiDB 4.1.1 SQL语句,索引,视图,存储过程,触发器 4.1.2 MySQL索引原理以及SQL优化 4.1.3 MySQL事务原理分析 4.1.4 MySQL缓存策略 4.2.1 TiDB存储引擎的原理 4.2.2 TiDB集群方案与Replication原理 4.3.1 Redis相关命令详解及其原理 4.3.2 Redis协议与异步方式 4.3.3 存储原理与数据模型 4.3.4 主从同步与对象模型 4.4.1 Nginx反向代理与系统参数配置conf原理 8.3.1 Kong 动态负载均衡与服务发现 4.4.2 Nginx过滤器模块实现 4.4.3 Nginx Handler模块实现 8.3.2 Kong 实时监控与REST API 8.3 分布式API网关 4.5.1 接口编程与文档操作 4.5.2 集群方案与持久化备份 5.1.1 Skynet设计原理 5.1.2 skynet网络层封装以及lua/c接口编程 5.1.3 skynet重要组件以及手撕游戏项目 5.3.1 DPDK环境与testpmd/l3fwd/skeletion 5.3.2 DPDK的用户态协议栈 5.3.3 千万级流量并发的dns处理 5.3.4 高性能数据处理框架vpp 5.3.5 DPDK的虚拟交换机框架OvS 5.2.1 TARS RPC服务模型原理 5.2.2 TARS公共框架服务与数据库 5.2.3 数据监控与服务性能压测 3.2.5 手写内存泄漏检测组件 8.1.2 Kafka存储机制 8.1.1 Kafka使用场景与设计原理 9.1 图床共享云存储 9.2 微服务即时通讯 7.1 测试框架gtest以及内存泄漏检测 7.2 火焰图的生成原理与构建方式 3.2.6 手把手实现分布式锁 6.1 Rust特性精讲 6.4 Rust项目 DBProxy代理mysql与Redis 6.2.1 网卡速度监控 6.2.2 邮件发送 6.2.3 OAuth2 第三方登陆 6.4.2 DBProxy的MySQL代理 6.4.3 DBProxy的Redis代理 6.4.1 DBProxy功能分析与设计实现 6.1.1 Rust Slice类型与泛型 6.1.3 Rust并发编程与智能指针 6.1.2 Rust文件操作与错误处理 6.3.1 Rust异步框架 tokio 6.3 第三方库 6.3.2 Rust web框架 Warp 6.3.3 Rust http库 hyper 6.2 组件实现 红黑树的应用场景 进程调度cfs,内存管理 红黑树的数学证明与推导 手撕红黑树的左旋与右旋 红黑树添加的实现与添加三种情况的证明 红黑树删除的实现与删除四种情况的证明 红黑树的线程安全的做法 分析红黑树工程实用的特点 单例模式 工厂方法模式与抽象工厂模式 原型模式 适配器模式 代理模式 桥接模式 组合模式 策略模式 观察者模式 责任链模式 状态模式 Makefile的规则与make的工作原理 单文件编译与多文件编译 Makefile的参数传递 多目录文件夹递归编译与嵌套执行make Makefile的通配符,伪目标,文件搜索 Makefile的操作函数与特殊语法 configure生成makefile的原则 cmake的写法 git的工作流程 创建操作与基本操作 分支管理,查看提交历史 git服务器搭建 进程间通信设施状态 ipcs Linux系统运行时长 uptime CPU平均负载和磁盘活动 iostat 监控,收集和汇报系统活动 sar 监控多处理器使用情况 mpstat 监控进程的内存使用情况 pmap 系统管理员调优和基准测量工具 nmon 密切关注Linux系统 glances 查看系统调用 strace ftp 服务器基本信息 ftptop 电量消耗和电源管理 powertop 监控 mysql 的线程和性能 mytop 系统运行参数分析 htop/top/atop Linux网络统计监控工具 netstat 显示和修改网络接口控制器 ethtool 网络数据包分析利刃 tcpdump 远程登陆服务的标准协议 telnet 获取实时网络统计信息 iptraf 显示主机上网络接口带宽使用情况 iftop socket与文件描述符的关联 sigio的异步通知 多路复用select/poll 手撕epoll单线程,多线程,多进程的多种写法 代码实现LT/ET的区别 reactor针对业务实现的优点 epoll封装 send_cb/recv_cb/accept_cb reactor多核实现 跨平台(select/epoll/kqueue)的封装reactor reactor sendbuffer与recvbuffer封装http协议 http协议格式 http2.0与http3.0 有限状态机fsm解析http https的工作流程 https证书配置 reactor sendbuffer与recvbuffer封装websocket协议 websocket握手流程 websocket协议头封装 tcp分包与粘包的解决方案 websocket数据流的编解码 同步处理与异步处理的数据差异 网络io线程池异步处理 ulimit的fd的百万级别支持 sysctl.conf的rmem与wmem的调优 conntrack的原理分析 redis单线程reactor的实现 memcached的多线程master-worker的reactor实现 nginx的多进程reactor的实现 多进程reactor的坑点,惊群,共享内存 connect,listen,accept与三次握手 listen参数backlog syn泛洪的解决方案 close与四次挥手 11个状态迁移 大量close_wait与time_wait的原因与解决方案 tcp keepalive与应用层心跳包 拥塞控制与滑动窗口 udp的优缺点 udp高并发的设计方案 qq早期为什么选择udp作为通信协议 udp可靠传输原理 quic协议的设计原理 quic的开源方案quiche kcp的设计方案与算法原理 协程存在的3个原因 同步与异步性能,服务端异步处理,客户端异步请求 协程原语 switch,resume,yield, 协程切换的三种实现方式,setjmp/longjmp, ucontext, 汇编实现 汇编实现 寄存器讲解 协程初始启动 eip寄存器设置 协程栈空间定义,独立栈与共享栈的做法 协程结构体定义 调度器的定义分析 超时集合,就绪队列,io等待集合的实现 协程调度的执行流程 协程接口实现,异步流程实现 hook钩子的实现 协程实现mysql请求 协程多核方案分析 协程性能测试 2.4 自研框架:用户态协议栈NtyTcp的实现 用户态协议栈的存在场景与实现原理 netmap开源框架 eth协议,ip协议,udp协议实现 arp协议实现 icmp协议实现 tcp协议头实现 tcp控制块的实现 滑动窗口的实现 重传定时器,坚持定时器,time_wait定时器,keepalive定时器 epoll数据结构封装与线程安全实现 协议栈fd就绪回调实现 epoll接口实现 LT/ET的实现 线程池的异步处理使用场景 线程池的组成 任务队列 执行队列 任务回调与条件等待 线程池的动态防缩 扩展:nginx线程池实现对比分析 内存池的应用场景与性能分析 内存小块分配与管理 内存大块分配与管理 手写内存池,结构体封装与API实现 避免内存泄漏的两种万能方法 定位内存泄漏的3种工具 扩展:nginx内存池实现 异步请求处理流程 King式四元组,create,commit,callback, destory 异步请求框架封装 应用协议redis/dns/http请求封装 连接池性能的影响的2个因素,tcp连接和mysql认证 连接请求归还策略 连接超时未归还策略 链接断开重连策略 连接数量最优策略 互斥锁的使用场景与原理 自旋锁的性能分析 原子操作的汇编实现 有锁无锁队列性能 内存屏障 Barrier 数组无锁队列设计实现 链表无锁队列设计实现 定时器的使用场景 定时器的红黑树存储 时间轮的实现 最小堆的实现 分布式定时器的实现 服务端reactor事件封装 libevent接口分析 event_base_new, event_add, event_del, event_base_loop memcached网络模块分析 libev的主要数据结构 EV_WATCH, EV_WATCH_LIST libevent与libev性能对比 日志库性能瓶颈分析 异步日志库设计与实现 批量写入与双缓存冲机制 奔溃后的日志找回 IM,云平台,nginx,http,redis协议设计 如何保证消息完整性 手撕protobuf IM通信协议 protobuf序列化与反序列化 protobuf编码原理 MySQL体系结构,SQL执行流程 SQL CURD与高级查询 视图,触发器,存储过程 MySQL权限管理 索引,约束以及之间的区别 B+树,聚集索引和辅助索引 最左匹配原则以及覆盖索引 索引失效以及索引优化原则 EXPLAIN执行计划以及优化选择过程分析 事务的ACID特性 MySQL并发问题 脏读,不可重复读,幻读 事务隔离级别 锁的类型,锁算法实现以及锁操作对象 S锁 X锁 IS锁 IX锁 记录锁,间隙锁,next-key lock 插入意向锁, 自增锁 MVCC原理剖析 读写分离,连接池的场景以及其局限a 缓存策略问题分析 缓存策略强一致性解决方案 缓存策略最终一致性解决方案 2种mysql缓存同步方案 从数据库与触发器+udf 缓存同步开源方案 go-mysql-transfer 缓存同步开源方案 canal原理分析 3种缓存故障,缓存击穿,缓存穿透,缓存雪崩 string,set,zset,list,hash 分布式锁的实现 lua脚本解决ACID原子性 Redis事务的ACID性质分析 Redis协议解析 特殊协议操作 订阅发布 手撕异步redis协议 string的三种编码方式 int,raw,embstr 双向链表的list实现 字典的实现,hash函数 解决键冲突与rehash 跳表的实现与数据论证 整数集合实现 压缩列表原理证明 对象的类型与编码 字符串对象 列表对象 哈希对象 集合对象 有序集合 类型检测与命令多态 内存回收 对象共享 对象空转时长 redis的3种集群方式 主从复制,sentinel,cluster 4种持久化方案 Nginx静态文件的配置 Nginx动态接口代理配置 Nginx对Mqtt协议转发 Nginx对Rtmp推拉流 Openresty对Redis缓存数据代理 Nginx Filter模块运行原理 过滤链表的顺序 模块开发数据结构 ngx_str_t, ngx_list_t, ngx_buf_t, ngx_chain_t error日志的用法 ngx_comond_t的讲解 ngx_http_module_t的执行流程 文件锁,互斥锁 slab共享内存 如何解决"惊群"问题 如何实现负载均衡 shmem的三种实现方式 原子操作 nginx channel 信号 信号量 Nginx Handler模块运行原理 ngx_module_t/ngx_http_module_t的讲解 ngx_http_top_body_filter/ngx_http_top_header_filter的原理 ngx_rbtree_t的使用方法 ngx_rbtree自定义添加方法 模块性能测试 Nginx的核心数据结构 ngx_cycle_t, ngx_event_moule_t http 请求的11个处理阶段 http包体处理 http响应发送 Nginx Upstream机制的设计与实现 文档/集合/聚合函数操作 五种索引做法 单字段索引,复合索引,TTL索引,全文索引,hash索引 GridFS存储大文件 WiredTiger存储引擎 WiredTiger的事务 journal日志 Master-Slave的三个服务 Mongos/config/shard服务 Replica Set读写策略 Sharding的实现与原理 三种Mongodb性能优化策略 时间同步,磁盘预读功能,内存管理 项目:MongoDB跨数据中心的数据复制平台 抓取Oplog操作日志 日志分离 日志订阅 数据路由 Cache同步 unordered_map stl容器 hash的用法与原理 shared_ptr, unique_ptr besic_regex,sub_match 函数对象模板 function,bind atomic的用法与原理 thread_local与cond_ition_variable 异常处理 exception_ptr 错误处理 error_category coroutine的用法与原理 死锁的现象以及原理 pthread_mutex_lock/pthread_mutex_unlock dlsym的实现 有向图的构建 有向图dfs判断环的存在 三个原语操作 lock_before, lock_after, unlock_after 死锁检测线程的实现 内存泄漏现象 第三方内存泄漏与代码内存泄漏 malloc与free的dlsym实现 内存检测策略 应用场景测试 多线程资源竞争 互斥锁,自旋锁 非公平锁的实现 公平锁的实现 加锁的异常情况 4.4 RocksDB 不一样的kv存储RocksDB的使用场景 RocksDB的特殊操作 集群三个组件 TiDB Server,PD Server, TiKV Server Raft协议讲解 OLTP与OLAP TiKV的Key-Value存储引擎 基于RBAC的权限管理 数据加密 日志结构的数据库引擎 前缀搜索 低优先级写入 生存时间的支持 Transactions 快照存储 SST文件格式 日志与监控 数据压缩 huge page TLB的支持 MemTable的两种实现Skiplist与HashSkiplist Lua的支持 多核并发编程-多线程,多进程,csp模型,actor模型 actor模型实现-lua服务和c服务 消息队列实现 actor消息调度 skynet reactor网络模型封装 socket/socketchannel封装 手撕高性能c服务 lua编程以及lua/c接口编程 基础接口 skynet.send,skynet.call,skynet.response 广播组件 multicastd 数据共享组件 sharedatad datasheet 手撕万人同时在线游戏 DPDK环境参数讲解 多队列网卡的工作原理 CPU亲和性 Burst数据包的优缺点 DPDK轮询模式 异步中断,轮询模式,混合中断轮询模式 virtio与vhost 内核网络接口 KNI的实现原理 接收线程/发送线程/KNI线程 内存数据结构 rte_mbuf, rte_mempool 端口数据结构 rte_kni, rte_kni_conf, rte_kni_ops, rte_eth_conf 协议数据结构 rte_ether_hdrrte_ipv4_hdr, rte_udp_hdr 数据处理接口 rte_eth_rx_burst,rte_kni_tx_burst,rte_pktmbuf_mtod udp协议包处理 dns协议实现 配置文件解析 数据结构 rte_ring trex数据包性能测试 vpp使用vmxnet3 DPDK ACL实现数据过滤 vpp web应用 vpp基础库 VPPInfra 高速查找路由表,CAM表 OvS三大组件 ovs-vswitchd, ovsdb-server, openvswitch.ko OvS报文处理机制 OvS 4种数据路径 VXLAN数据协议 TARS 服务端与客户端 HTTP开始以及RPC通信 基础组件 框架服务解析 TarsCpp组件 智能指针与MySQL操作 自定义洺实现高效服务管理 服务鉴权避免数据泄露 多种远程调用方式 TarsBenchmark压测利器 TARS染色日志 TARS服务信息上报 DCache分布式存储 8.4 分布式存储与容器 8.2 分布式服务 googletest与googlemock文件 函数检测以及类测试 test fixture 测试夹具 类型参数化 事件测试 内存泄漏 设置期望,期待参数,调用次数,满足期望 火焰图使用场景与原理 nginx动态火焰图 MySQL火焰图 Redis火焰图 火焰图工具讲解 etcd配置服务、服务发现、集群监控、leader选举、分布式锁 etcd体系结构详解(gRPC,WAL, Snapshot、BoltDB、Raft) etcd存储原理深入剖析(B树、B+树) etcd读写机制以及事务的acid特性分析 ceph的集群部署 monitor与OSD ceph 5个核心组件 ceph集群监控 ceph性能调调优与benchmark Docker镜像管理 镜像元数据管理与存储驱动 网络管理与GRE实现跨网络通信 Docker容器安全解决方案 SElinux Dockerfile的容器构建 编排三剑客 Fig/Compose/Swarm 编排小神器 Fleet Flynn体系架构与实现原理 发布订阅模式 点对点消息传递 Kafka Brokers原理 Topics和Partition Partition存储分布 Partition文件存储机制 Segment文件存储结构 offset查找message 高效文件存储设计 bthread的使用 熔断原理 brpc的一致性hash flatmap 最小化延时的LB brpc的内存管理 线程模型以及thread-local nginx,openresty,Kong之间的“苟且” 动态负载均衡的原理 服务发现实现的原理 Serverless 系统日志 监控,故障检测与恢复 代理层缓存与响应服务 ACL,bot检测,黑白名单 云原生 性能压测与分析 let关键字 数据类型 字符串字面量 元组定义与解构(destructing)赋值 Rust 堆与栈 借用ownership与引用 切片Slice定义 结构体使用与实例化 mod关键字与模块封装 use关键字 cargo.toml讲解 cargo build与cargo run Rust集合 Vector,HashMap,HashSet 错误处理Recoverable与UnRecoverable Rust泛型与trait 特质 包管理器 Cargo 文件输入输出流的读写操作 第三方库引入 迭代器Iterator 闭包Closure Box指针 Rust线程 thread::spawn 1. MySQL:《高性能MySQL 第3版》 2. Nginx:《深入理解Nginx:模块开发与架构分析(第2版)》(陶辉) 4. Linux内核:《深入理解Linux内核架构》 (郭旭 译) 5. 数据结构与算法:《算法导论》(第3版) 6. 性能分析:《性能之巅 洞悉系统、企业与云计算》 7. MongoDB:《MongoDB权威指南》 8. Ceph:《Ceph分布式存储学习指南》(Ceph中国社区) 9. Docker:《Docker容器与容器云(第2版)》 10. TCP/IP:《Tcp/Ip详解卷一卷二卷三》 11. Linux系统编程:《Unix环境高级编程》 12. 计算机:《深入理解计算机系统》 13. DPDK:《深入浅出DPDK》 3. Redis:Redis设计与实现 (黄健宏) 10. 配套参考书籍资料 11. 零声服务 课程方式 98次直播课,持续9个月,每周二四六 8点到10点 课前预习资料 课后思考实践作业 班主任督学 作业统计 博客统计 老师答疑 工作问题 课程问题 奖学金机制 最高1000元 公开透明 面试跳槽 简历梳理 技术点凸显 项目技术梳理 模拟面试 技术表述 薪资谈判 福利争取 offer选择 职业规划 技术前景 学习方法 学员风采 每次课知识点总结成技术博客(奖学金评选项) 每次课实践题完成github(奖学金评选项) 课程与工作相结合,重新思考需求功能 不理解的技术点 跟老师沟通 往期数据 2021年8月统计 腾讯offer比例 15% 知名企业offer比例 73% 最高offer腾讯T3.1(现T9) 年薪65w 最高年薪涨幅 30W 最快跳槽学习时间1个半月 部分offer列表 学员直播分享视频 学员回访 9.1.1 fastdfs架构分析和配置 fastdfs架构分析 快速配置fastdfs 上传文件逻辑分析 下载文件逻辑分析 9.1.2 fastdfs存储原理 tracker,storage分析 存储机制 支持断点续传 相同文件内容只保存一份 9.1.3 分布式fastdfs存储集群部署 同步机制 线性扩容 如何实现高可用 负载均衡 9.1.4 高负载nginx/fastcgi fastdfs-nginx-module模块分析 fastcgi请求与响应 nginx与fastcgi如何通信 nginx-fastcgi-fastdfs如何实现上传下载 9.1.5 文件传输和接口设计 http接口设计 图床数据库设计 图床文件上传,下载,分享功能实现 业务流程实现 9.1.6 产品上云公网发布/测试用例 使用云服务器的各种坑分析 fiddler监控http请求,postman模拟请求 wrk测试接口吞吐量 jmeter压力测试 9.2.1 IM即时通讯项目框架分析和部署 接入层、逻辑层、持久层架构划分 消息实时性分析 即时通讯数据库设计 单聊、群聊消息原理 群成员管理 未读消息原理 池化技术的使用 快速配置IM项目 9.2.2 IM消息服务器/文件传输服务器 protobuf通信协议设计 数据库分表设计 reactor百万并发模型 login_server负载均衡 登录请求响应模型 9.2.3 消息服务器/路由服务器 请求登陆逻辑 最近联系会话逻辑 查询用户在线主题 未读消息机制 单聊消息推拉机制 群聊消息推拉机制 路由转发机制 9.2.4 数据库代理服务器设计 main函数主流程 响应流程 redis缓存 消息计数(单聊和群聊) 未读消息机制 群成员管理 单聊群聊 9.2.5 文件服务器和docker部署 在线文件传输机制分析 离线文件传输机制分析 etcd微服务注册与发现 docker制作与部署 9.2.6 产品上云公网发布/公网测试上线 单元测试案例 testbench如何设计 IM项目性能压测 定制私有功能 云服务器部署 适宜工程师人群 5. 工作中技术没有挑战,工作中接触不到新技术的在职工程师 2. 从事嵌入式方向开发,想转入互联网开发的在职工程师 4. 从事非开发岗位(算法岗,运维岗,测试岗),想转后台开发岗位的在职工程师 6. 自己研究学习速度较慢,不能系统构建知识体系的开发人员 7. 了解很多技术名词,但是深入细问又不理解的工程师 8. 计算机相关专业想进入大厂的在校生(本科及以上学历,有c/c++基础) 3. 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师 1. 从事业务开发多年,对底层原理理解不够深入的在职工程师 零声其他课程 FFmpeg/WebRTC/RTMP/RTSP/HLS/播放器-音视频流媒体高级开发 C/C++企业级项目实战班(浏览器/即时通讯/网盘/安全卫士/播放器) golang/云原生/Docker/DevOps/K8S/持续集成/分布式/etcd/ipfs Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 tokio的使用场景与引用规范 tokio库 hyper/tonic/tower/bytes tokio多线程与调度器 异步tcp/udp tokio性能测试 warp 接口编写规范 字符串序列化 动态检测与追踪 https实现原理 异步设计 性能测试 客户端与服务器实现 async关键字与协程 无栈协程与有栈协程 hyper使用场景 github用户授权登陆 微信用户授权登陆 微博用户授权登陆 OAuth2授权流程讲解 http请求与响应解析 Rust调用c接口 网卡监控与速度分析的原理 实时运行速率 Rust模块封装 邮件协议讲解 SMTP发送与POP3收取 邮件内容封装与解析 实现异步sql请求 接口路由 项目需求与组件的运行场景 代理的request与response Passthrough的实现 MySQL协议分析 SQL执行日志捕获 获取sql执行时间 记录sql用于后续回滚 测试用例 Redis协议分析 pipeline的实现 redis异步执行 与MySQL代理合并封装 性能测试与分析 raft共识算法详解(leader选举+日志复制) 磁盘结构分析与数据存储原理 多叉树的运用以及B树的定义证明 B树插入的两种分裂 B树删除的前后借位与节点合并 手撕B树的插入,删除,遍历,查找 B+树的定义与实现 B+树叶子节点的前后指针 B+树的应用场景与实用特点 B+树的线程安全做法 hash的原理与hash函数的实现 hash的应用场景 分布式hash的实现原理 海量数据去重布隆过滤器 布隆过滤的数学推导与证明