Re: [PATCH v2 01/10] Define a structure for object IDs.
- From
Michael Haggerty <mhagger@alum.mit.edu>
- Date
- Mar 12, 2015, 10:28 UTC
- Message-ID
- <55016A3A.6010100@alum.mit.edu>
- In-Reply-To
- <xmqqr3sv3vsf.fsf@gitster.dls.corp.google.com>
On 03/12/2015 01:26 AM, Junio C Hamano wrote:
Show 35 quoted lines
> "brian m. carlson" <sandals@crustytoothpaste.net> writes: > >> Michael Haggerty recommended that I call the structure element sha1 >> instead of oid in case we want to turn this into a union if we decide to >> go the additional hash route. > > I'd advise against it. > > As I wrote in $gmane/265337 in response to Michael: > > > 4. We continue to support working with SHA-1s declared to be (unsigned > > char *) in some performance-critical code, even as we migrate most other > > code to using SHA-1s embedded within a (struct object_id). This will > > cost some duplication of code. To accept this approach, we would need an > > idea of *how much* code duplication would be needed. E.g., how many > > functions will need both (unsigned char *) versions and (struct > > object_id *) versions? > > ... > > I do not know what kind of code duplication you are worried about, > though. If a callee needs "unsigned char *", the caller that has a > "struct object_id *o" should pass o->hash to the callee. > > And that would break the abstraction effort if you start calling the > field with a name that is specific to the underlying hash function. > The caller has to change o->sha1 to o->sha256 instead of keeping > that as o->oid and letting the callee handle the implementation > details when calling > > if (!hashcmp(o1->oid, o2->oid)) > ; /* they are the same */ > else > ; /* they are different */ > [...]
Hmm, I guess you imagine that we might sometimes pack SHA-1s, sometimes SHA-256s (or whatever) in the "oid" field, which would be dimensioned large enough for either one (with, say, SHA-1s padded with zeros).
I was imagining that this would evolve into a union (or maybe struct) of different hash types, like
struct object_id {
unsigned char hash_type;
union {
unsigned char sha1[GIT_SHA1_RAWSZ];
unsigned char sha256[GIT_SHA256_RAWSZ];
} hash;
};BTW in either case, any hopes of mapping object_id objects directly on top of buffer memory would disappear.
Michael
-- Michael Haggerty mhagger@alum.mit.edu