]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge branch 'int-new' of gitlab.labs.nic.cz:labs/bird into int-new
authorJan Moskyto Matejka <mq@ucw.cz>
Fri, 13 May 2016 11:48:04 +0000 (13:48 +0200)
committerJan Moskyto Matejka <mq@ucw.cz>
Fri, 13 May 2016 11:48:04 +0000 (13:48 +0200)
lib/hash.h
nest/rt-attr.c

index 04a16a7e7a2e61d122c9edec0cb0fdfe8ab6c546..c2fd8bca5655f6a1c31a030d1967cdca3921cf62 100644 (file)
 
 #define HASH_WALK_FILTER_END } while (0)
 
-typedef u64 mem_hash_t;
-
 static inline void
-mem_hash_init(mem_hash_t *h)
+mem_hash_init(u64 *h)
 {
   *h = 0x001047d54778bcafULL;
 }
 
 static inline void
-mem_hash_mix(mem_hash_t *h, void *p, int s)
+mem_hash_mix(u64 *h, void *p, int s)
 {
   const u64 multiplier = 0xb38bc09a61202731ULL;
   const char *pp = p;
   uint i;
-  for (i=0; i<s; i++)
+  for (i=0; i<s/4; i++)
+    *h = *h * multiplier + ((const u32 *)pp)[i];
+  
+  for (i=s & ~0x3; i<s; i++)
     *h = *h * multiplier + pp[i];
 }
 
 static inline uint
-mem_hash_value(mem_hash_t *h)
+mem_hash_value(u64 *h)
 {
   return ((*h >> 32) ^ (*h & 0xffffffff));
 }
@@ -205,7 +206,7 @@ mem_hash_value(mem_hash_t *h)
 static inline uint
 mem_hash(void *p, int s)
 {
-  static mem_hash_t h;
+  static u64 h;
   mem_hash_init(&h);
   mem_hash_mix(&h, p, s);
   return mem_hash_value(&h);
index 5041ab9f53484fed0d44ec9039cbc1ce426d018e..167bfc44a9dd76d5eb64666bd4750b4c8f375eb4 100644 (file)
@@ -946,7 +946,7 @@ rta_alloc_hash(void)
 static inline uint
 rta_hash(rta *a)
 {
-  mem_hash_t h;
+  u64 h;
   mem_hash_init(&h);
 #define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f));
   MIX(src);
@@ -961,6 +961,7 @@ rta_hash(rta *a)
   MIX(dest);
   MIX(flags);
   MIX(aflags);
+#undef MIX
 
   return mem_hash_value(&h) ^ mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs);
 }