[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