[Mesa-dev] [PATCH 148/133] util/hash_table: Pull the details of the FNV-a1 into helpers

Matt Turner mattst88 at gmail.com
Tue Jan 6 17:03:32 PST 2015


On Tue, Jan 6, 2015 at 4:34 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> 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>

This didn't actually Cc him.

> ---
>  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;

I don't think you want this in the header.


More information about the mesa-dev mailing list