git/list[1] front-page[2] threads[3] people[4] search[5] about
wed 2026-10-07 18:10 UTC

Re: [PATCH 0/4] Add a compile-time option to use the new, very fast sha1dc Rust crate

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 3, 2026, 10:23 UTC
Message-ID
<09b76ee1-2bac-4c33-b09d-d414717d3ced@gmx.de>
In-Reply-To
<xmqqa4p0jz0d.fsf@gitster.g>
Hi Junio,
On Tue, 29 Sep 2026, Junio C Hamano wrote:
Show 26 quoted lines
> "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
> 
> > I stumbled across this new Rust crate last week. Its performance
> > numbers are quite impressive. Naturally, I want to make use of this
> > and get for Windows, which is used on many monorepos where this makes
> > a real difference: In a pretty fast and loose test, I verified that a
> > git index-pack runs roughly three times faster solely due to using
> > those SIMD-based optimizations!
> >
> > As a safety precaution, because this sha1dc crate is quite new, I
> > wanted to introduce an escape hatch: core.sha1dcBackend=c, but turn it
> > on by default, which is the reason for the three additional patches.
> > Should these patches be undesirable for the Git project? I would not
> > be mad at all if they were simply dropped.
> >
> > Johannes Schindelin (4):
> >   libgitcore: add `sha1dc` as an optional feature
> >   sha1dc: allow selecting the C backend without rebuilding
> >   pthread: provide `pthread_once()` shims for Windows and for
> >     NO_PTHREADS
> >   sha1dc: make `sha1dc_init()` thread-safe
> 
> The feature sha1dc_choose() means that you can between Rust and C
> implementations of sha1dc pick at runtime and I was confused by the
> "compile-time" in the topic title, which is misleading.

Right. I was almost certain that you'd reject the runtime flag, which is really only interesting for binary-first distribution vectors such as Git for Windows but not source-code-only releases such as core Git's.

Show 9 quoted lines
> From the end-user's point of view, being able to choose between the two
> at runtime gives them a lot bigger value, even though from the point of
> view of the developer who added the feature to allow users to do so,
> that feature being a compile-time choice might matter more.
> 
> How close are these two implementations?  Do they implement the same
> idea but the details may differ?  Do they both faithfully implement
> what the same paper wrote and given the same fudged input they will
> always detect the attempted attack the same way?

Those two implementations are quite different. As the author of the Rust crate detailed in https://sam.dev/blog/faster-sha1-collision-detection, they first tried to accelerate the quite faithful Rust port of the library that is used by Git, and while there were some gains to be made, a more fundamental approach proved to offer way bigger wins.

While I would have _loved_ to have the time to dig into this myself, armed with pencil and paper only, and doing maths again for once, I simply could not afford the time to assess the validity of the Rust `sha1dc` implementation without AI assistance. With that disclaimer out of the way (which should actually _increase_ your confidence, because I haven't been in the math business in a very, very long time, so the double-teaming with GPT-5.5 Sol and Opus 5.5 probably increased the soundness of my analysis), here are my findings:

- The Rust implementation chooses a different approach from the C
  implementation. The idea is the same, though: to dismiss as quickly as
  possible as many of the DV vectors (each check can cover several of
  those at once). It's just that with SIMD, the technique differs, and
  that informs about the order and the grouping of those checks.
  (In more technical terms: The UBC filter is different, not the overall
  collision-detection algorithm. Both Rust and C implementation cover the
  same per-DV affine solution space over GF(2), albeit with different
  equations).
- While the approach is different, exploiting SIMD-specific advantages to
  great speed-wise effects, the covered DV vectors are exactly the same,
  and the filtering and recompression checks are equivalent; therefore
  both C and Rust implementation detect the very same class of collisions
  under the paper's assumptions.
- The Rust implementation is robust and correct. I performed a light
  (well, for me, not so much for the AI models) static analysis, and then
  I ran some substantial tests. My plan was to exercise Git's entire test
  suite (with a patched-in mode that would exercise both C and Rust and
  validate that they compute the same SHA-1), but I haven't managed to
  kick off _those_ particular AI-assisted sessions yet (I would want to
  exercise both x86_64 and aarch64, of course).
- The reason why I posted this before I finished _all_ the tests? To allow
  other Git contributors an early look, and to inspire (see e.g. Scott's
  alternative), to invite collaboration on this patch series.

Ciao, Johannes

Previous: Junio C HamanoNext: brian m. carlson
Message 8 of 9 in “Add a compile-time option to use the new, very fast sha1dc Rust crate”
  1. 0/4 Add a compile-time option to use the new, very fast sha1dc Rust crateJohannes Schindelin via GitGitGadget, Sep 28, 2026
  2. 1/4 libgitcore: add `sha1dc` as an optional featureJohannes Schindelin via GitGitGadget, Sep 28, 2026
  3. 2/4 sha1dc: allow selecting the C backend without rebuildingJohannes Schindelin via GitGitGadget, Sep 28, 2026
  4. 3/4 pthread: provide `pthread_once()` shims for Windows and for NO_PTHREADSJohannes Schindelin via GitGitGadget, Sep 28, 2026
  5. 4/4 sha1dc: make `sha1dc_init()` thread-safeJohannes Schindelin via GitGitGadget, Sep 28, 2026
  6. Johannes SchindelinSep 28, 2026
  7. Junio C HamanoSep 29, 2026
  8. Johannes SchindelinOct 3, 2026
  9. brian m. carlsonOct 3, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.