[Mesa-dev] [PATCH 148/133] util/hash_table: Pull the details of the FNV-a1 into helpers
Jason Ekstrand
jason at jlekstrand.net
Tue Jan 6 16:34:21 PST 2015
This way the basics of the FNV-a1 hash can be reused to easily create other
hashing functions.
Cc: Eric Anholt <eric at anholt.net>
---
src/util/hash_table.c | 17 ++++-------------
src/util/hash_table.h | 19 +++++++++++++++++++
2 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/src/util/hash_table.c b/src/util/hash_table.c
index 920bdfd..ece72bc 100644
--- a/src/util/hash_table.c
+++ b/src/util/hash_table.c
@@ -396,27 +396,18 @@ _mesa_hash_table_random_entry(struct hash_table *ht,
uint32_t
_mesa_hash_data(const void *data, size_t size)
{
- uint32_t hash = 2166136261ul;
- const uint8_t *bytes = data;
-
- while (size-- != 0) {
- hash ^= *bytes;
- hash = hash * 0x01000193;
- bytes++;
- }
-
- return hash;
+ return _mesa_FNV32_1a_accumulate_block(_mesa_FNV32_1a_offset_bias,
+ data, size);
}
/** FNV-1a string hash implementation */
uint32_t
_mesa_hash_string(const char *key)
{
- uint32_t hash = 2166136261ul;
+ uint32_t hash = _mesa_FNV32_1a_offset_bias;
while (*key != 0) {
- hash ^= *key;
- hash = hash * 0x01000193;
+ hash = _mesa_FNV32_1a_accumulate(hash, *key);
key++;
}
diff --git a/src/util/hash_table.h b/src/util/hash_table.h
index d6b6ebf..3d98cea 100644
--- a/src/util/hash_table.h
+++ b/src/util/hash_table.h
@@ -90,6 +90,25 @@ static inline uint32_t _mesa_hash_pointer(const void *pointer)
return _mesa_hash_data(&pointer, sizeof(pointer));
}
+static const uint32_t _mesa_FNV32_1a_offset_bias = 2166136261u;
+
+static inline uint32_t
+_mesa_FNV32_1a_accumulate_block(uint32_t hash, const void *data, size_t size)
+{
+ const uint8_t *bytes = (const uint8_t *)data;
+
+ while (size-- != 0) {
+ hash ^= *bytes;
+ hash = hash * 0x01000193;
+ bytes++;
+ }
+
+ return hash;
+}
+
+#define _mesa_FNV32_1a_accumulate(hash, expr) \
+ _mesa_FNV32_1a_accumulate_block(hash, &(expr), sizeof(expr))
+
/**
* This foreach function is safe against deletion (which just replaces
* an entry's data with the deleted marker), but not against insertion
--
2.2.0
More information about the mesa-dev
mailing list