diff options
author | David Robillard <d@drobilla.net> | 2021-07-22 18:35:31 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-01-14 19:37:51 -0500 |
commit | 955be33cead7596506cf86211da6b0e53827ef96 (patch) | |
tree | 0dac1a7a31e8c50d1ba7200648d6ce402f97867d /src/zix/digest.h | |
parent | 34852e8faa380f12b11522cfa998df4f260e3856 (diff) | |
download | serd-955be33cead7596506cf86211da6b0e53827ef96.tar.gz serd-955be33cead7596506cf86211da6b0e53827ef96.tar.bz2 serd-955be33cead7596506cf86211da6b0e53827ef96.zip |
Avoid dynamic allocation when fetching interned nodes
This is more or less a total rewrite of SerdNodes and the underlying ZixHash to
make efficient use of the new node construction API.
Diffstat (limited to 'src/zix/digest.h')
-rw-r--r-- | src/zix/digest.h | 72 |
1 files changed, 57 insertions, 15 deletions
diff --git a/src/zix/digest.h b/src/zix/digest.h index 1fde77a9..6df70024 100644 --- a/src/zix/digest.h +++ b/src/zix/digest.h @@ -1,5 +1,5 @@ /* - Copyright 2012-2020 David Robillard <d@drobilla.net> + Copyright 2012-2021 David Robillard <d@drobilla.net> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -27,38 +27,80 @@ extern "C" { #endif /** - Return an initial empty digest value. + @addtogroup zix + @{ + @name Digest + Functions to generate a short "digest" of data with minimal collisions. + + These are good general-purpose hash functions for indexing arbitrary data, + but are not necessarily stable across platforms and should never be used for + cryptographic purposes. + @{ */ -ZIX_CONST_API -uint32_t -zix_digest_start(void); /** - Update `hash` to include `buf`, a buffer of `len` bytes. + Return a 32-bit hash of a buffer. This can be used for any size or alignment. */ ZIX_PURE_API uint32_t -zix_digest_add(uint32_t hash, const void* buf, size_t len); +zix_digest32(uint32_t seed, const void* buf, size_t len); /** - Update `hash` to include `buf`, a 64-bit aligned buffer of `len` bytes. + Return a 32-bit hash of an aligned buffer. - Both `buf` and `len` must be evenly divisible by 8 (64 bits). + Both the buffer and size must be aligned to 32 bits. For data that fits + these requirements, this is equivalent to, but faster than, zix_digest32(). */ ZIX_PURE_API uint32_t -zix_digest_add_64(uint32_t hash, const void* buf, size_t len); +zix_digest32_aligned(uint32_t seed, const void* buf, size_t len); /** - Update `hash` to include `ptr`. + Return a 64-bit hash of a buffer. - This hashes the value of the pointer itself, and does not dereference `ptr`. + This can be used for any size or alignment. */ -ZIX_CONST_API -uint32_t -zix_digest_add_ptr(uint32_t hash, const void* ptr); +ZIX_PURE_API +uint64_t +zix_digest64(uint64_t seed, const void* buf, size_t len); + +/** + Return a 64-bit hash of an aligned buffer. + + Both the buffer and size must be aligned to 64 bits. For data that fits + these requirements, this is equivalent to, but faster than, zix_digest64(). +*/ +ZIX_PURE_API +uint64_t +zix_digest64_aligned(uint64_t seed, const void* buf, size_t len); + +/** + Return a pointer-sized hash of a buffer. + + This can be used for any size or alignment. + + Internally, this simply dispatches to zix_digest32() or zix_digest64() as + appropriate. +*/ +ZIX_PURE_API +size_t +zix_digest(size_t seed, const void* buf, size_t len); + +/** + Return a pointer-sized hash of an aligned buffer. + + Both the buffer and size must be aligned to the pointer size. For data that + fits these requirements, this is equivalent to, but faster than, + zix_digest(). + + Internally, this simply dispatches to zix_digest32_aligned() or + zix_digest64_aligned() as appropriate. +*/ +ZIX_PURE_API +size_t +zix_digest_aligned(size_t seed, const void* buf, size_t len); #ifdef __cplusplus } /* extern "C" */ |