Skip to content

Releases: ericfitz/sqdist

v0.6.0

Choose a tag to compare

@ericfitz ericfitz released this 30 Aug 02:27

This release is about performance. Where v0.5.0 focused on adding typosquat-detection
capability (--typosquat, --pypi, -n/--normalize), v0.6.0 changes nothing you can see and
a great deal you can measure.

The output contract is unchanged. Every optimization here is output-preserving, verified
byte-for-byte against a full-PyPI-corpus golden baseline, and against per-technique recall over
a labeled typosquat set.

What got faster

Measured on 879,732 PyPI package names, release build, single-threaded:

Command v0.5.0 v0.6.0 Speedup
--string requests --list pypi -t 1 3.11 s 0.20 s 15.5x
same, 30-char query 5.58 s 0.16 s 34x
--typosquat 3.46 s 0.50 s 6.9x
--typosquat --pypi 3.71 s 0.65 s 5.7x
npm corpus (4.39 M names), -t 1 18.33 s 1.13 s 16.2x

How

  • A two-stage exact emit gate. Candidates are rejected before any distance panel is built:
    first a length-difference lower bound, then a banded O(n*k) k-bounded Damerau that answers
    damerau <= k without computing the distance. Both tests are exact, so the gate is a pure
    short-circuit and never a heuristic filter.
  • A prepared query. In list mode the --string side is normalized and skeletonized once,
    not once per candidate.
  • Fewer allocations per pair — roughly 40 down to 5.

ASCII pairs run the banded kernel on bytes, skipping the char collect entirely.

Notes

  • macOS binaries are signed, notarized, and (for the .pkg) stapled.
  • Homebrew: brew tap ericfitz/tap && brew install sqdist
  • crates.io: cargo install sqdist

Full Changelog: v0.5.0...v0.6.0

v0.5.0

Choose a tag to compare

@ericfitz ericfitz released this 27 Aug 03:48

Full Changelog: v0.3.0...v0.5.0

v0.3.0

Choose a tag to compare

@ericfitz ericfitz released this 24 May 20:46

Full Changelog: v0.2.0...v0.3.0