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

Re: [PATCH v1 3/4] hashmap: add simplified hashmap_get_from_hash() API

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 7, 2014, 17:43 UTC
Message-ID
<xmqqk37pdpzb.fsf@gitster.dls.corp.google.com>
In-Reply-To
<53B48613.60509@gmail.com>
Karsten Blees <karsten.blees@gmail.com> writes:
Show 5 quoted lines
> Hashmap entries are typically looked up by just a key. The hashmap_get()
> API expects an initialized entry structure instead, to support compound
> keys. This flexibility is currently only needed by find_dir_entry() in
> name-hash.c (and compat/win32/fscache.c in the msysgit fork). All other
> (currently five) call sites of hashmap_get() have to set up a near emtpy
s/emtpy/empty/;
Show 10 quoted lines
> entry structure, resulting in duplicate code like this:
>
>   struct hashmap_entry keyentry;
>   hashmap_entry_init(&keyentry, hash(key));
>   return hashmap_get(map, &keyentry, key);
>
> Add a hashmap_get_from_hash() API that allows hashmap lookups by just
> specifying the key and its hash code, i.e.:
>
>   return hashmap_get_from_hash(map, hash(key), key);

While I think the *_get_from_hash() is an improvement over the three-line sequence, I find it somewhat strange that callers of it still must compute the hash code themselves, instead of letting the hashmap itself to apply the user supplied hash function to the key to derive it. After all, the map must know how to compare two entries via a user-supplied cmpfn given at the map initialization time, and the algorithm to derive the hash code falls into the same category, in the sense that both must stay the same during the lifetime of a hashmap, no? Unless there is a situation where you need to be able to initialize a hashmap_entry without knowing which hashmap the entry will eventually be stored, it feels dubious API that exposes to the outside callers hashmap_entry_init() that takes the hash code without taking the hashmap itself.

In other words, why isn't hashmap_get() more like this:
        void *hashmap_get(const struct hashmap *map, const void *key)
        {
                struct hashmap_entry keyentry;
                hashmap_entry_init(&keyentry, map->hash(key));
                return *find_entry_ptr(map, &keyentry, key);
        }
with hashmap_entry_init() purely a static helper in hashmap.c?
Previous: Karsten BleesNext: Karsten Blees
Message 6 of 12 in “hashmap improvements”
  1. 0/4 hashmap improvementsKarsten Blees, Jul 2, 2014
  2. 1/4 hashmap: factor out getting an int hash code from a, SHA1Karsten Blees, Jul 2, 2014
  3. Junio C HamanoJul 7, 2014
  4. 2/4 hashmap: improve struct hashmap member documentationKarsten Blees, Jul 2, 2014
  5. 3/4 hashmap: add simplified hashmap_get_from_hash() APIKarsten Blees, Jul 2, 2014
  6. Junio C HamanoJul 7, 2014
  7. Karsten BleesJul 11, 2014
  8. Junio C HamanoJul 11, 2014
  9. 4/4 hashmap: add string interning APIKarsten Blees, Jul 2, 2014
  10. Matthieu MoyJul 3, 2014
  11. Junio C HamanoJul 7, 2014
  12. Matthieu MoyJul 3, 2014

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.