7个不稳定版本 (3个破坏性更新)
使用旧的Rust 2015
0.4.1 | 2017年5月21日 |
---|---|
0.4.0 | 2017年5月7日 |
0.3.2 | 2017年5月6日 |
0.3.1 | 2017年4月15日 |
0.1.0 | 2017年4月1日 |
#2224 in 算法
每月155次下载
43KB
769 行
bcmp
bcmp
是一个简单的crate,它提供超越简单相等的数据比较机制。它只操作字节切片,因此得名,并依赖于在两个数据块之间高效地找到公共子串。该实现依赖于两种不同的线性时间算法:一种基于HashMap
的算法,称为HashMatch
,以及使用Ukkonen算法构建的后缀树,称为TreeMatch
。
示例
使用HashMatch
迭代两个字符串之间的匹配,最小匹配长度为2个字节
extern crate bcmp;
use bcmp::{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 bcmp;
use std::fs::File;
use std::io::Read;
use bcmp::{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