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

Ben Pfaff blp at nicira.com
Thu Dec 16 22:42:25 UTC 2010


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





More information about the dev mailing list