git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 5/6] Do linear-time/space rename logic for exact renames

From
Linus Torvalds <torvalds@linux-foundation.org>
Date
Oct 25, 2007, 20:25 UTC
Message-ID
<alpine.LFD.0.999.0710251317020.30120@woody.linux-foundation.org>
In-Reply-To
<Pine.LNX.4.64.0710251522190.7345@iabervon.org>
On Thu, 25 Oct 2007, Daniel Barkalow wrote:
Show 7 quoted lines
> 
> Creating a list of the pointers doesn't work correctly with the grow 
> implementation, because growing the hash may turn a collision into a 
> non-collision, at which point items other than the first cannot be found 
> (since they're listed inside a bucket that's now wrong for them). AFAIK, 
> resizing a hash table requires being able to figure out what happened with 
> collisions.
Nope. 
The hash algorithm is much smarter than that.

I *always* uses a full 32-bit hash, and no amount of resizing is ever going to change that. The index into the hash-table is in fact entirely unused.

This has several good properties:
 - it means that hash-table resizing is a non-event
 - it means that you always have the full 32-bit hash, and a collision in 
   the hash size never causes unnecessary work apart from the fact that 
   the code walks the hash table a bit more.
 - because the hash is embedded in the table itself, it has relatively 
   good cache behaviour when compared to something that needs to actually 
   follow the pointer to validate the full data. So assuming that the full 
   32-bit hash is good enough to effectively never have any collisions 
   (or, assuming you don't even *care* about the collisions, which is the 
   case when you're just generating content fingerprints for lines when 
   comparing the data in two files), you never end up with unnecessarily 
   following pointers to cachelines that you are not interested in.

The last point at least somewhat mitigates the (inevitably) bad cache behaviour that hash tables tend to have. It's not like it's going to be wonderful in the cache, but at least it's less horrid than the more common implementation that needs to follow the pointer to validate each hash entry that may or may not be a collision.

but the important part is #1, which is what allows the code to be a generic hash algorithm that resizes the hash table without even understanding or caring what is behind the pointer.

		Linus
Previous: Daniel BarkalowNext: Daniel Barkalow
Message 14 of 18 in “Cleaned-up rename detection patch-series”
  1. 0/6 Cleaned-up rename detection patch-seriesLinus Torvalds, Oct 25, 2007
  2. 1/6 Add 'diffcore.h' to LIB_HLinus Torvalds, Oct 25, 2007
  3. 2/6 Split out "exact content match" phase of rename detectionLinus Torvalds, Oct 25, 2007
  4. 3/6 Ref-count the filespecs used by diffcoreLinus Torvalds, Oct 25, 2007
  5. 4/6 copy vs rename detection: avoid unnecessary O(n*m) loopsLinus Torvalds, Oct 25, 2007
  6. Junio C HamanoOct 26, 2007
  7. Linus TorvaldsOct 26, 2007
  8. Junio C HamanoOct 26, 2007
  9. Linus TorvaldsOct 26, 2007
  10. 5/6 Do linear-time/space rename logic for exact renamesLinus Torvalds, Oct 25, 2007
  11. Daniel BarkalowOct 25, 2007
  12. Jeff KingOct 25, 2007
  13. Daniel BarkalowOct 25, 2007
  14. Linus TorvaldsOct 25, 2007
  15. Daniel BarkalowOct 25, 2007
  16. 6/6 Do exact rename detection regardless of rename limitsLinus Torvalds, Oct 25, 2007
  17. Linus TorvaldsOct 25, 2007
  18. Jeff KingOct 25, 2007

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.