Make flow_hash() use hash_lookup3(), for speed and hash quality.
authorBen Pfaff <blp@nicira.com>
Tue, 23 Dec 2008 23:03:37 +0000 (15:03 -0800)
committerBen Pfaff <blp@nicira.com>
Tue, 23 Dec 2008 23:06:14 +0000 (15:06 -0800)
lib/flow.c
lib/flow.h

index 5fddf1fecb2d095a02e723aed69faae0de736875..8b05b0a53e56e0ac4bda0009d9b2ede866c38c47 100644 (file)
@@ -227,8 +227,11 @@ flow_compare(const struct flow *a, const struct flow *b)
     return memcmp(a, b, sizeof *a);
 }
 
-unsigned long int
-flow_hash(const struct flow *flow, uint32_t basis) 
+size_t
+flow_hash(const struct flow *flow, uint32_t basis)
 {
-    return hash_fnv(flow, sizeof *flow, basis);
+    BUILD_ASSERT_DECL(!(sizeof *flow % sizeof(uint32_t)));
+    return hash_lookup3((const uint32_t *) flow,
+                        sizeof *flow / sizeof(uint32_t), basis);
 }
+
index 0a952f9be4b82e88fc0dfd3c84e5834d64a64f09..1d7becf3a8f41be0dca89e11cefad35f76fd4a72 100644 (file)
@@ -56,11 +56,11 @@ struct flow {
     uint8_t nw_proto;           /* IP protocol. */
     uint8_t reserved;           /* Pad to 32-bit alignment. */
 };
-BUILD_ASSERT_DECL(sizeof (struct flow) == 32);
+BUILD_ASSERT_DECL(sizeof(struct flow) == 32);
 
 int flow_extract(struct ofpbuf *, uint16_t in_port, struct flow *);
 void flow_print(FILE *, const struct flow *);
 int flow_compare(const struct flow *, const struct flow *);
-unsigned long int flow_hash(const struct flow *, uint32_t basis);
+size_t flow_hash(const struct flow *, uint32_t basis);
 
 #endif /* flow.h */