#byte-slice #binary-data #algorithm #comparison #linear-time #substrings #string

bytecmp

bytecmp 提供快速的二进制数据比较算法,用于枚举常见子串、唯一子串或确定补丁集

3 个不稳定版本

使用旧的 Rust 2015

0.5.1 2024 年 3 月 19 日
0.5.0 2024 年 3 月 19 日
0.4.2 2024 年 3 月 19 日

#531 in 算法

MIT 许可证

47KB
846

bytecmp

Crates.io Docs.rs

bytecmp 是一个简单的包,提供超越简单相等的比较机制。它只操作字节切片,因此得名,并依赖于在两个数据块之间高效地找到公共子串。实现依赖于两种不同的线性时间算法:一个基于 HashMap 的算法称为 HashMatch,以及使用 Ukkonen 算法构建的后缀树,称为 TreeMatch

bytecmphaxelion/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