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

Re: [PATCH 03/15] cache: add an algo member to struct object_id

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Apr 11, 2021, 21:37 UTC
Message-ID
<YHNsEVMs2lRmycOx@camp.crustytoothpaste.net>
In-Reply-To
<87mtu5f31u.fsf@evledraar.gmail.com>
On 2021-04-11 at 11:55:57, Ævar Arnfjörð Bjarmason wrote:
Show 37 quoted lines
> 
> On Sat, Apr 10 2021, brian m. carlson wrote:
> 
> > Now that we're working with multiple hash algorithms in the same repo,
> > it's best if we label each object ID with its algorithm so we can
> > determine how to format a given object ID. Add a member called algo to
> > struct object_id.
> >
> > Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
> > ---
> >  hash.h | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/hash.h b/hash.h
> > index 3fb0c3d400..dafdcb3335 100644
> > --- a/hash.h
> > +++ b/hash.h
> > @@ -181,6 +181,7 @@ static inline int hash_algo_by_ptr(const struct git_hash_algo *p)
> >  
> >  struct object_id {
> >  	unsigned char hash[GIT_MAX_RAWSZ];
> > +	int algo;
> 
> Curiosity since I'm not as familiar as you with the multi-hash support
> by far:
> 
> So struct object_id is GIT_MAX_RAWSZ, not two types of structs for
> GIT_SHA1_RAWSZ and GIT_SHA256_RAWSZ. That pre-dates this series because
> we'd like to not deal with two types of objects everywhere for SHA-1 and
> SHA-256. Makes sense.
> 
> Before this series we'd memcmp them up to their actual length, but the
> last GIT_MAX_RAWSZ-GIT_SHA1_RAWSZ would be uninitialized
> 
> Now we pad them out, so the last 96 bits of every SHA1 are 0000...;
> Couldn't we also tell which hash an object is by memcmp-ing those last N
> bits and see if they're all zero'd?

That makes a lot of assumptions about the security of the hash algorithm that I don't want to make here. If anyone can ever find a SHA-256 hash with trailing 96 bits zero, then they can confuse it with a SHA-1 hash. That means that our security level goes from 128 bits to 96 bits. It's also a nonstandard construction.

More importantly, it results in the null OID being treated as a SHA-1 OID. Because we do print the null OID in some cases, we're going to break a lot of output formats if we print all the rest of the OIDs with 64 characters and then the null OID with 40. That's to say nothing of the problems in binary formats.

The reason we pad these objects is because our hashmaps are broken if we don't. I don't remember all the gory details, but it was obvious to me that if they weren't consistently equal, things were going to be broken. That's the only reason, not theoretical purity.

> Feels a bit hackish, and we'd need to reconsider that method if we'd
> ever support other same-length hashes.

My hope is that we don't need to do this, but we do have SHA-3 to serve as a backup for SHA-2. If quantum computers don't progress substantially, SHA-3-256 is definitely a viable candidate for replacement if anything ever happens to SHA-256.

> But OTOH having these objects all padded out in memory to the same
> length, but having to carry around a "what hash algo" is it yields the
> arguably weird hack of having a per-hash NULL_OID, which has never been
> an actual object of any hash type, but just a pseudo-object.

Unfortunately, as I mentioned above, we need to have two null OIDs to handle printing things out. It's inconvenient, I agree.

Show 6 quoted lines
> I abandoned it as insany sillyness after playing with it for about a
> day, but it did reveal that much of the hash code now can assume
> internal length == formatting length, which is why I'm 3 paragraphs into
> this digression, i.e. maybe some of the code structure also makes having
> a NULL_OID always be 256-bits when we want to format it as 160/256
> painful...

We'll always format based on the algorithm in the OID. That's the simplest way to make things work because unfortunately we may end up with both types of OIDs in the same code paths (as we're converting one to the other) and otherwise our printing functions need a lot of special handling and even more variants than they have today.

-- 
brian m. carlson (he/him or they/them)
Houston, Texas, US
Previous: Ævar Arnfjörð BjarmasonNext: Derrick Stolee
Message 64 of 71 in “SHA-256 / SHA-1 interop, part 1”
  1. 00/15 SHA-256 / SHA-1 interop, part 1brian m. carlson, Apr 10, 2021
  2. 01/15 sha1-file: allow hashing objects literally with any algorithmbrian m. carlson, Apr 10, 2021
  3. Denton LiuApr 15, 2021
  4. brian m. carlsonApr 15, 2021
  5. Ævar Arnfjörð BjarmasonApr 16, 2021
  6. Junio C HamanoApr 16, 2021
  7. 04/15 Always use oidread to read into struct object_idbrian m. carlson, Apr 10, 2021
  8. 05/15 hash: add a function to finalize object IDsbrian m. carlson, Apr 10, 2021
  9. 07/15 builtin/pack-redundant: avoid casting buffers to struct object_idbrian m. carlson, Apr 10, 2021
  10. 08/15 cache: compare the entire buffer for struct object_idbrian m. carlson, Apr 10, 2021
  11. Chris TorekApr 11, 2021
  12. Ævar Arnfjörð BjarmasonApr 11, 2021
  13. brian m. carlsonApr 11, 2021
  14. 10/15 hash: provide per-algorithm null OIDsbrian m. carlson, Apr 10, 2021
  15. Junio C HamanoApr 11, 2021
  16. brian m. carlsonApr 11, 2021
  17. 09/15 hash: set and copy algo field in struct object_idbrian m. carlson, Apr 10, 2021
  18. Ævar Arnfjörð BjarmasonApr 11, 2021
  19. brian m. carlsonApr 11, 2021
  20. Ævar Arnfjörð BjarmasonApr 11, 2021
  21. brian m. carlsonApr 11, 2021
  22. 0/2 C99: harder dependency on variadic macrosÆvar Arnfjörð Bjarmason, Apr 12, 2021
  23. 2/2 C99 support: remove non-HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Apr 12, 2021
  24. Junio C HamanoApr 12, 2021
  25. Jeff KingApr 13, 2021
  26. Jonathan NiederMay 21, 2021
  27. 1/2 git-compat-util.h: clarify comment on GCC-specific codeÆvar Arnfjörð Bjarmason, Apr 12, 2021
  28. Jeff KingApr 13, 2021
  29. Junio C HamanoApr 13, 2021
  30. Jeff KingApr 14, 2021
  31. Ævar Arnfjörð BjarmasonApr 14, 2021
  32. Jeff KingApr 14, 2021
  33. Jonathan NiederMay 21, 2021
  34. Bagas SanjayaApr 12, 2021
  35. Ævar Arnfjörð BjarmasonApr 12, 2021
  36. brian m. carlsonApr 12, 2021
  37. Junio C HamanoApr 12, 2021
  38. 0/2 C99: remove hardcoded-out !HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Jan 28, 2022
  39. 1/2 git-compat-util.h: clarify GCC v.s. C99-specific in commentÆvar Arnfjörð Bjarmason, Jan 28, 2022
  40. 2/2 C99: remove hardcoded-out !HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Jan 28, 2022
  41. Junio C HamanoJan 28, 2022
  42. 0/3 C99: remove dead !HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Feb 19, 2022
  43. 1/3 git-compat-util.h: clarify GCC v.s. C99-specific in commentÆvar Arnfjörð Bjarmason, Feb 19, 2022
  44. 3/3 trace.h: remove never-used TRACE_CONTEXTÆvar Arnfjörð Bjarmason, Feb 19, 2022
  45. Junio C HamanoFeb 20, 2022
  46. Ævar Arnfjörð BjarmasonFeb 20, 2022
  47. Junio C HamanoFeb 20, 2022
  48. 2/3 C99: remove hardcoded-out !HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Feb 19, 2022
  49. 0/2 C99: remove dead !HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Feb 21, 2022
  50. 1/2 git-compat-util.h: clarify GCC v.s. C99-specific in commentÆvar Arnfjörð Bjarmason, Feb 21, 2022
  51. 2/2 C99: remove hardcoded-out !HAVE_VARIADIC_MACROS codeÆvar Arnfjörð Bjarmason, Feb 21, 2022
  52. Junio C HamanoApr 12, 2021
  53. Ævar Arnfjörð BjarmasonApr 12, 2021
  54. 11/15 builtin/show-index: set the algorithm for object IDsbrian m. carlson, Apr 10, 2021
  55. 12/15 commit-graph: don't store file hashes as struct object_idbrian m. carlson, Apr 10, 2021
  56. 15/15 hex: print objects using the hash algorithm memberbrian m. carlson, Apr 10, 2021
  57. 02/15 builtin/hash-object: allow literally hashing with a given algorithmbrian m. carlson, Apr 10, 2021
  58. Ævar Arnfjörð BjarmasonApr 11, 2021
  59. brian m. carlsonApr 11, 2021
  60. Ævar Arnfjörð BjarmasonApr 16, 2021
  61. Ævar Arnfjörð BjarmasonApr 16, 2021
  62. 03/15 cache: add an algo member to struct object_idbrian m. carlson, Apr 10, 2021
  63. Ævar Arnfjörð BjarmasonApr 11, 2021
  64. brian m. carlsonApr 11, 2021
  65. Derrick StoleeApr 13, 2021
  66. brian m. carlsonApr 14, 2021
  67. Ævar Arnfjörð BjarmasonApr 15, 2021
  68. brian m. carlsonApr 15, 2021
  69. 06/15 Use the final_oid_fn to finalize hashing of object IDsbrian m. carlson, Apr 10, 2021
  70. 13/15 builtin/pack-objects: avoid using struct object_id for pack hashbrian m. carlson, Apr 10, 2021
  71. 14/15 hex: default to the_hash_algo on zero algorithm valuebrian m. carlson, Apr 10, 2021

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.