[ovs-dev] [multipath 1/7] hash: Make functions for hashing a few words easier to use.

Justin Pettit jpettit at nicira.com
Fri Dec 17 18:26:53 UTC 2010


Looks good.

--Justin


On Dec 16, 2010, at 2:42 PM, Ben Pfaff wrote:

> It's easier for the client to pass in data directly than it is for the
> client to stuff it into an array.
> 
> These functions will have new users in upcoming commits.
> ---
> lib/hash.c |   23 +++++++++++++----------
> lib/hash.h |   13 +++++++++----
> 2 files changed, 22 insertions(+), 14 deletions(-)
> 
> diff --git a/lib/hash.c b/lib/hash.c
> index 63b4784..61e17b2 100644
> --- a/lib/hash.c
> +++ b/lib/hash.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2008, 2009 Nicira Networks.
> + * Copyright (c) 2008, 2009, 2010 Nicira Networks.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -52,21 +52,24 @@ hash_words(const uint32_t *p, size_t n, uint32_t basis)
>     return c;
> }
> 
> -/* Returns the hash of the pair of aligned 32-bit words at 'p', starting from
> - * 'basis'. */
> +/* Returns the hash of 'a', 'b', and 'c'. */
> uint32_t
> -hash_2words(const uint32_t *p, uint32_t basis)
> +hash_3words(uint32_t a, uint32_t b, uint32_t c)
> {
> -    uint32_t a, b, c;
> -
> -    a = b = c = 0xdeadbeef + (2 << 2) + basis;
> -    b += p[1];
> -    a += p[0];
> +    a += 0xdeadbeef;
> +    b += 0xdeadbeef;
> +    c += 0xdeadbeef;
>     HASH_FINAL(a, b, c);
> -
>     return c;
> }
> 
> +/* Returns the hash of 'a' and 'b'. */
> +uint32_t
> +hash_2words(uint32_t a, uint32_t b)
> +{
> +    return hash_3words(a, b, 0);
> +}
> +
> /* Returns the hash of the 'n' bytes at 'p', starting from 'basis'. */
> uint32_t
> hash_bytes(const void *p_, size_t n, uint32_t basis)
> diff --git a/lib/hash.h b/lib/hash.h
> index 5f6409c..109612f 100644
> --- a/lib/hash.h
> +++ b/lib/hash.h
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2008, 2009 Nicira Networks.
> + * Copyright (c) 2008, 2009, 2010 Nicira Networks.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -49,7 +49,8 @@
>     } while (0)
> 
> uint32_t hash_words(const uint32_t *, size_t n_word, uint32_t basis);
> -uint32_t hash_2words(const uint32_t *, uint32_t basis);
> +uint32_t hash_2words(uint32_t, uint32_t);
> +uint32_t hash_3words(uint32_t, uint32_t, uint32_t);
> uint32_t hash_bytes(const void *, size_t n_bytes, uint32_t basis);
> 
> static inline uint32_t hash_string(const char *s, uint32_t basis)
> @@ -58,7 +59,11 @@ static inline uint32_t hash_string(const char *s, uint32_t basis)
> }
> 
> /* This is Bob Jenkins' integer hash from
> - * http://burtleburtle.net/bob/hash/integer.html, modified for style. */
> + * http://burtleburtle.net/bob/hash/integer.html, modified for style.
> + *
> + * This hash is faster than hash_2words(), but it isn't as good when 'basis' is
> + * important.  So use this function for speed or hash_2words() for hash
> + * quality. */
> static inline uint32_t hash_int(uint32_t x, uint32_t basis)
> {
>     x -= x << 6;
> @@ -87,7 +92,7 @@ static inline uint32_t hash_double(double x, uint32_t basis)
>     BUILD_ASSERT_DECL(sizeof x == sizeof value);
> 
>     memcpy(value, &x, sizeof value);
> -    return hash_2words(value, basis);
> +    return hash_3words(value[0], value[1], basis);
> }
> 
> static inline uint32_t hash_pointer(const void *p, uint32_t basis)
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org





More information about the dev mailing list