]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Hash: Fix of previous commit
authorJan Moskyto Matejka <mq@ucw.cz>
Fri, 13 May 2016 11:46:46 +0000 (13:46 +0200)
committerJan Moskyto Matejka <mq@ucw.cz>
Fri, 13 May 2016 11:46:46 +0000 (13:46 +0200)
lib/hash.h
nest/rt-attr.c

index b86a2eb13594e3e0dc699fac6180b58e56444bc0..c2fd8bca5655f6a1c31a030d1967cdca3921cf62 100644 (file)
 
 #define HASH_WALK_FILTER_END } while (0)
 
-typedef mem_hash_t  u64;
-
 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 ((value >> 32) ^ (value & 0xffffffff));
+  return ((*h >> 32) ^ (*h & 0xffffffff));
 }
 
 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 62340530ac8c18bfdb2a91184738680df3bb2d7d..6ec69a7fde93fcc1d25bb015bb386cf03a71ba32 100644 (file)
@@ -946,9 +946,9 @@ 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, &(rta->f), sizeof(rta->f));
+#define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f));
   MIX(src);
   MIX(hostentry);
   MIX(iface);
@@ -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);
 }