aboutsummaryrefslogtreecommitdiffstats
path: root/src/zix/digest.h
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-07-22 18:35:31 -0400
committerDavid Robillard <d@drobilla.net>2022-01-14 19:37:51 -0500
commit955be33cead7596506cf86211da6b0e53827ef96 (patch)
tree0dac1a7a31e8c50d1ba7200648d6ce402f97867d /src/zix/digest.h
parent34852e8faa380f12b11522cfa998df4f260e3856 (diff)
downloadserd-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.h72
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" */