This will be useful shortly. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- hashmap.c | 7 ++++++- hashmap.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hashmap.c b/hashmap.c index d42f01ff5a..d103eb1fd2 100644 --- a/hashmap.c +++ b/hashmap.c @@ -26,13 +26,18 @@ unsigned int strihash(const char *str) return hash; } +unsigned int memhash_feed(unsigned int hash_seed, const unsigned char next) +{ + return (hash_seed * FNV32_PRIME) ^ next; +} + unsigned int memhash(const void *buf, size_t len) { unsigned int hash = FNV32_BASE; unsigned char *ucbuf = (unsigned char *) buf; while (len--) { unsigned int c = *ucbuf++; - hash = (hash * FNV32_PRIME) ^ c; + hash = memhash_feed(hash, c); } return hash; } diff --git a/hashmap.h b/hashmap.h index 7cb29a6aed..c2464385ed 100644 --- a/hashmap.h +++ b/hashmap.h @@ -105,10 +105,13 @@ * `strihash` and `memihash` are case insensitive versions. * `memihash_cont` is a variant of `memihash` that allows a computation to be * continued with another chunk of data. + * `memhash_feed` takes just one character and returns the hash based off + * a previous hash. */ extern unsigned int strhash(const char *buf); extern unsigned int strihash(const char *buf); extern unsigned int memhash(const void *buf, size_t len); +extern unsigned int memhash_feed(unsigned int hash_seed, const unsigned char next); extern unsigned int memihash(const void *buf, size_t len); extern unsigned int memihash_cont(unsigned int hash_seed, const void *buf, size_t len); -- 2.15.0.rc2.6.g953226eb5f