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

Re: heads-up: git-index-pack in "next" is broken

From
Linus Torvalds <torvalds@osdl.org>
Date
Oct 18, 2006, 16:52 UTC
Message-ID
<Pine.LNX.4.64.0610180938540.3962@g5.osdl.org>
In-Reply-To
<Pine.LNX.4.64.0610180845040.18388@alien.or.mcafeemobile.com>
On Wed, 18 Oct 2006, Davide Libenzi wrote:
Show 5 quoted lines
>
> Speaking in general, seen at the hash function level, of course an interface 
> should not give different result for different word sizes or word endianess. 
> Considering the diff algorithm as interface, as I said, the output was 
> unaffected by the 64 bits word size. It was just very slow.

Well, even the output may actually be affected, in the case of _real_ hash collisions (as opposed to just the hash _list_ collision that XDL_HASHLONG caused).

So I actually think it would be better to have "uint32_t" as the hash value - because that would mean that all diffs (or, in the case of the block-algorithm, the deltas) are guaranteed to give the same results regardless of architecture.

Right now, we actually generate a 64-bit hash value (BUT: for short lines, it's likely only _interesting_ in the low bits, so the high bits tend to have a very high likelihood of being zero). So hash collisions are different: on a 32-bit architecture, two lines may have the same hash, while on a 64-bit one, they are different.

And together with some of the limiters we have (eg XDL_MAX_EQLIMIT) hash collisions can sometimes affect the output.

Admittedly, in _practice_ this is really unlikely to affect anything (you'd get a valid diff in either case, they'd just possibly be subtly different, and the input data must be _really_ strange to even see that case), but I do think that the hash algorithm can matter.

NOTE! I'm not talking about XDL_HASHLONG(), I'm talking about the xdl_hash_record() hash, which returns differently-sized hash results on 32-bit and 64-bit. And there are cases where we _only_ compare the hashes, and don't actually double-check the contents.

So I think that in _practice_ you can't see differences between a 32-bit version and a 64-bit one, but the possibility is there. Using "uint32_t" instead of "unsigned long" to keep track of hashes would avoid that theoretical problem (and might actually make for better performance on 64-bit archtiectures, if only because of denser data structures and thus better cache behaviour).

			Linus
Previous: Davide LibenziNext: Davide Libenzi
Message 21 of 33 in “heads-up: git-index-pack in "next" is broken”
  1. Junio C HamanoOct 17, 2006
  2. Nicolas PitreOct 17, 2006
  3. Junio C HamanoOct 17, 2006
  4. Nicolas PitreOct 17, 2006
  5. Junio C HamanoOct 17, 2006
  6. Nicolas PitreOct 17, 2006
  7. Sergey VlasovOct 17, 2006
  8. Junio C HamanoOct 17, 2006
  9. Nicolas PitreOct 17, 2006
  10. Nicolas PitreOct 17, 2006
  11. Linus TorvaldsOct 17, 2006
  12. Nicolas PitreOct 17, 2006
  13. Linus TorvaldsOct 17, 2006
  14. Nicolas PitreOct 18, 2006
  15. Linus TorvaldsOct 18, 2006
  16. Nicolas PitreOct 18, 2006
  17. Linus TorvaldsOct 18, 2006
  18. Davide LibenziOct 18, 2006
  19. Linus TorvaldsOct 18, 2006
  20. Davide LibenziOct 18, 2006
  21. Linus TorvaldsOct 18, 2006
  22. Davide LibenziOct 18, 2006
  23. Linus TorvaldsOct 18, 2006
  24. Davide LibenziOct 18, 2006
  25. Junio C HamanoOct 18, 2006
  26. Nicolas PitreOct 18, 2006
  27. Junio C HamanoOct 18, 2006
  28. Junio C HamanoOct 18, 2006
  29. Johannes SchindelinOct 18, 2006
  30. Nicolas PitreOct 18, 2006
  31. Nicolas PitreOct 18, 2006
  32. Junio C HamanoOct 17, 2006
  33. Nicolas PitreOct 18, 2006

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.