#algorithm #data #binary-data #substrings #patch #offers #comparison

bcmp

bcmp提供快速二进制数据比较算法,用于列举公共子串、唯一子串或确定补丁集

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 算法

Download history 50/week @ 2024-04-07 76/week @ 2024-04-14 48/week @ 2024-04-21 67/week @ 2024-04-28 44/week @ 2024-05-05 45/week @ 2024-05-12 46/week @ 2024-05-19 31/week @ 2024-05-26 59/week @ 2024-06-02 42/week @ 2024-06-09 44/week @ 2024-06-16 36/week @ 2024-06-23 69/week @ 2024-06-30 22/week @ 2024-07-07 23/week @ 2024-07-14 39/week @ 2024-07-21

每月155次下载

MIT许可证

43KB
769

bcmp

Crates.io Build Status Docs.rs

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