3 个不稳定版本
使用旧的 Rust 2015
0.5.1 | 2024 年 3 月 19 日 |
---|---|
0.5.0 | 2024 年 3 月 19 日 |
0.4.2 | 2024 年 3 月 19 日 |
#531 in 算法
47KB
846 行
bytecmp
bytecmp
是一个简单的包,提供超越简单相等的比较机制。它只操作字节切片,因此得名,并依赖于在两个数据块之间高效地找到公共子串。实现依赖于两种不同的线性时间算法:一个基于 HashMap
的算法称为 HashMatch
,以及使用 Ukkonen 算法构建的后缀树,称为 TreeMatch
。
bytecmp
是 haxelion/bcmp 的分支。
示例
使用 HashMatch
遍历两个字符串之间的匹配项,最小匹配长度为 2 字节
extern crate bytecmp;
use bytecmp::{AlgoSpec, MatchIterator};
fn main() {
let a = "abcdefg";
let b = "012abc34cdef56efg78abcdefg";
let match_iter = MatchIterator::new(a.as_bytes(), b.as_bytes(), AlgoSpec::HashMatch(2));
for m in match_iter {
println!("Match: {:}", &a[m.first_pos..m.first_end()]);
}
}
使用 TreeMatch
构建补丁集以从文件 a
构建文件 b
,最小匹配长度为 4 字节
extern crate bytecmp;
use std::fs::File;
use std::io::Read;
use bytecmp::{AlgoSpec, patch_set};
fn main() {
let mut a = Vec::<u8>::new();
let mut b = Vec::<u8>::new();
File::open("a").unwrap().read_to_end(&mut a);
File::open("b").unwrap().read_to_end(&mut b);
let ps = patch_set(&a, &b, AlgoSpec::TreeMatch(4));
for patch in ps {
println!("b[0x{:x}..0x{:x}] == a[0x{:x}..0x{:x}]", patch.second_pos, patch.second_end(), patch.first_pos, patch.first_end());
}
}
依赖项
~2MB
~42K SLoC