mitsuhiko/similar

A high level diffing library for rust based on diffs

1,317

stars

255

commits

Rust

primary language

Aug 29, 2026

updated

insta.rs/similar
diff
patch
rust
unified-diff

README

Similar: A Diffing Library

Crates.io License Documentation

Similar is a dependency free crate for Rust that implements different diffing algorithms and high level interfaces for it. It was originally inspired by pijul's diff library but has since changed significantly. This library was built for the insta snapshot testing library.

use similar::{ChangeTag, TextDiff};

fn main() {
    let diff = TextDiff::from_lines(
        "Hello World\nThis is the second line.\nThis is the third.",
        "Hallo Welt\nThis is the second line.\nThis is life.\nMoar and more",
    );

    for change in diff.iter_all_changes() {
        let sign = match change.tag() {
            ChangeTag::Delete => "-",
            ChangeTag::Insert => "+",
            ChangeTag::Equal => " ",
        };
        print!("{}{}", sign, change);
    }
}

Screenshot

terminal highlighting

What's in the box?

  • Practical heuristic Myers diff and raw Myers diff
  • Patience diff
  • Hunt-style diff
  • Histogram diff
  • Classic LCS table diff
  • Diffing on arbitrary comparable sequences
  • Line, word, character and grapheme level diffing
  • Text and Byte diffing
  • Unified diff generation
  • Structured three-way line merging with merge and diff3 conflict output

no_std Support

similar now enables std by default.

For no_std + alloc usage:

[dependencies]
similar = { version = "3", default-features = false }

Backend selection in no_std mode:

  • default (default-features = false): alloc::collections::BTreeMap
  • default-features = false, features = ["hashbrown"]: hashbrown::HashMap

Performance Testing

The repository includes Criterion and allocation benchmarks and a generative performance fuzzer that isolates every diff algorithm, captures stacks on timeouts, and saves reproducible input pairs.

Contributors

mitsuhiko

243 commits

DenialAdams

1 commits

jryans

1 commits

kianmeng

1 commits

mitsuhiko/similar

A high level diffing library for rust based on diffs

1,317

stars

255

commits

Rust

primary language

Aug 29, 2026

updated

insta.rs/similar
diff
patch
rust
unified-diff

README

Similar: A Diffing Library

Crates.io License Documentation

Similar is a dependency free crate for Rust that implements different diffing algorithms and high level interfaces for it. It was originally inspired by pijul's diff library but has since changed significantly. This library was built for the insta snapshot testing library.

use similar::{ChangeTag, TextDiff};

fn main() {
    let diff = TextDiff::from_lines(
        "Hello World\nThis is the second line.\nThis is the third.",
        "Hallo Welt\nThis is the second line.\nThis is life.\nMoar and more",
    );

    for change in diff.iter_all_changes() {
        let sign = match change.tag() {
            ChangeTag::Delete => "-",
            ChangeTag::Insert => "+",
            ChangeTag::Equal => " ",
        };
        print!("{}{}", sign, change);
    }
}

Screenshot

terminal highlighting

What's in the box?

  • Practical heuristic Myers diff and raw Myers diff
  • Patience diff
  • Hunt-style diff
  • Histogram diff
  • Classic LCS table diff
  • Diffing on arbitrary comparable sequences
  • Line, word, character and grapheme level diffing
  • Text and Byte diffing
  • Unified diff generation
  • Structured three-way line merging with merge and diff3 conflict output

no_std Support

similar now enables std by default.

For no_std + alloc usage:

[dependencies]
similar = { version = "3", default-features = false }

Backend selection in no_std mode:

  • default (default-features = false): alloc::collections::BTreeMap
  • default-features = false, features = ["hashbrown"]: hashbrown::HashMap

Performance Testing

The repository includes Criterion and allocation benchmarks and a generative performance fuzzer that isolates every diff algorithm, captures stacks on timeouts, and saves reproducible input pairs.

Contributors

mitsuhiko

243 commits

DenialAdams

1 commits

jryans

1 commits

kianmeng

1 commits

Languages

Rust

99.8%