Init
[?]
May 9, 2021, 7:15 AM
NDLYQELBP7HW4Z5G4M347WYKBDC2KVNBRPQQL63NKNPHHMHZI5LACDependencies
Change contents
- file addition: src[1.0]
- file addition: main.rs[0.6]
use std::collections::HashMap;use std::collections::hash_map::Entry;use rand::Rng;use adler32::*;fn main() {let mut rng = rand::thread_rng();let m: Vec<u8> = (0..1000).map(|_| rng.gen()).collect();let n = {let (a, b) = m.split_at(420);let mut n = a.to_vec();n.extend((0..10).map(|_| rng.gen::<u8>()));n.extend(b);n};let window = 100;let mut m_ad = Vec::with_capacity(m.len() / window);let mut m_h = HashMap::with_capacity(m.len() / window);'outer: for ch in m.chunks(window) {let ad = adler32(ch).unwrap();match m_h.entry(ad) {Entry::Vacant(e) => { e.insert(vec![m_ad.len()]); },Entry::Occupied(mut e) => {let e = e.get_mut();for &i in e.iter() {let old = &n[i * window .. (i+1) * window];if old == ch {continue 'outer}}e.push(m_ad.len());},}m_ad.push(ad);}println!("{:?}", m_ad);let mut ad = RollingAdler32::from_buffer(&n[..window]);let mut mm = Vec::new();let mut i = window;while i < n.len() {let h = ad.hash();if let Some(v) = m_h.get(&h) {for &v in v.iter() {let old = &m[v * window .. (v+1)*window];let new = &n[i - window .. i];if old == new {mm.push(Chunk::Old {pos: v});for _ in 0..window {let a = n[i];let b = n[i - window];ad.remove(window, b);ad.update(a);i += 1;}break}}} else {if let Some(Chunk::New { ref mut len, .. }) = mm.last_mut() {*len += 1} else {mm.push(Chunk::New { start: i - window, len: 1 })}let a = n[i];let b = n[i - window];ad.remove(window, b);ad.update(a);i += 1;};}println!("{:?}", mm);}#[derive(Debug)]enum Chunk {Old { pos: usize },New { start: usize, len: usize },} - file addition: Cargo.toml[1.0]
[package]name = "bindiff"version = "0.1.0"authors = ["Pierre-Étienne Meunier <pmeunier@mailbox.org>"]edition = "2018"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]adler32 = "*"rand = "*"diffs = "*"