用 Aho–Corasick 把多模式串匹配压到一次扫描
手写 KMP 在 N 个关键字下退化为 O(N·M),AC 自动机用 BFS 构造 fail 指针后能把整体复杂度压回 O(text + sum_pattern)。本文从 trie 出发推导 fail 指针递推关系,并给出一个对 cache 友好的双数组实现版本。
断断续续记录一些算法、性能优化、逆向工程与系统编程的研究心得。大部分文章源于工作或业余项目中遇到的具体问题,慢工出细活。
手写 KMP 在 N 个关键字下退化为 O(N·M),AC 自动机用 BFS 构造 fail 指针后能把整体复杂度压回 O(text + sum_pattern)。本文从 trie 出发推导 fail 指针递推关系,并给出一个对 cache 友好的双数组实现版本。
把 std::unordered_map、absl::flat_hash_map、自己手写的 Robin Hood 开放寻址表放在同一组 benchmark 上做对比。重点观察 load factor 在 0.75 / 0.9 / 0.95 三档下的查找 / 插入 / 删除尾延迟,附 perf stat 的分支预测错失率。
总结启发式合并、可持久化合并、动态开点合并三种线段树合并的常见写法。重点讨论空间回收(垃圾池)在多组数据下的正确性、以及为什么 push_down 在合并过程中必须谨慎处理。
不依赖固定签名的情况下,怎样用 IDA + symbol 反射在 PIE 打包后的二进制里稳定找到全局对象指针。文章给出一组针对 UE5.x 的 FName pool 头部特征,以及对应的字节流匹配脚本。
单个 Bloom Filter 长期使用会污染严重,时间窗口下滚动 N 个 Bloom 并循环擦除可以以可控的内存换取近似 LRU 语义。本文讨论 hash function 选型(xxhash vs murmur3)以及容量估算公式。
CreateFileMapping / ReadFileScatter / OVERLAPPED + IOCP 三套方案在百 MB 至几 GB 文件上的 throughput 与峰值内存对比。结论是 IOCP 配合多队列在多核机上能稳定吃满 NVMe,但要注意 cache flush 行为。
SA-IS 的 O(n) 构造算法比 DC3 更优雅,但首次实现时会被 L/S 分类和 LMS 子串排序绕晕。本文按 induced sorting 的思路一步一步还原算法,配可视化的样例 trace。
基于 Lemire 的工作,用 AVX2 一次性处理 32 字节并通过查表完成 UTF-8 多字节边界校验。文章给出在 Zen3 / Skylake-X 上的实测吞吐,并讨论 fallback 路径的设计。
个人独立博客,主要写一些自己感兴趣的话题。文章为原创笔记,转载请注明出处。
邮箱:vaxis@vaxis.cc