root/net/ceph/crush/hash.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. crush_hash32_rjenkins1
  2. crush_hash32_rjenkins1_2
  3. crush_hash32_rjenkins1_3
  4. crush_hash32_rjenkins1_4
  5. crush_hash32_rjenkins1_5
  6. crush_hash32
  7. crush_hash32_2
  8. crush_hash32_3
  9. crush_hash32_4
  10. crush_hash32_5
  11. crush_hash_name

   1 // SPDX-License-Identifier: GPL-2.0
   2 #ifdef __KERNEL__
   3 # include <linux/crush/hash.h>
   4 #else
   5 # include "hash.h"
   6 #endif
   7 
   8 /*
   9  * Robert Jenkins' function for mixing 32-bit values
  10  * http://burtleburtle.net/bob/hash/evahash.html
  11  * a, b = random bits, c = input and output
  12  */
  13 #define crush_hashmix(a, b, c) do {                     \
  14                 a = a-b;  a = a-c;  a = a^(c>>13);      \
  15                 b = b-c;  b = b-a;  b = b^(a<<8);       \
  16                 c = c-a;  c = c-b;  c = c^(b>>13);      \
  17                 a = a-b;  a = a-c;  a = a^(c>>12);      \
  18                 b = b-c;  b = b-a;  b = b^(a<<16);      \
  19                 c = c-a;  c = c-b;  c = c^(b>>5);       \
  20                 a = a-b;  a = a-c;  a = a^(c>>3);       \
  21                 b = b-c;  b = b-a;  b = b^(a<<10);      \
  22                 c = c-a;  c = c-b;  c = c^(b>>15);      \
  23         } while (0)
  24 
  25 #define crush_hash_seed 1315423911
  26 
  27 static __u32 crush_hash32_rjenkins1(__u32 a)
  28 {
  29         __u32 hash = crush_hash_seed ^ a;
  30         __u32 b = a;
  31         __u32 x = 231232;
  32         __u32 y = 1232;
  33         crush_hashmix(b, x, hash);
  34         crush_hashmix(y, a, hash);
  35         return hash;
  36 }
  37 
  38 static __u32 crush_hash32_rjenkins1_2(__u32 a, __u32 b)
  39 {
  40         __u32 hash = crush_hash_seed ^ a ^ b;
  41         __u32 x = 231232;
  42         __u32 y = 1232;
  43         crush_hashmix(a, b, hash);
  44         crush_hashmix(x, a, hash);
  45         crush_hashmix(b, y, hash);
  46         return hash;
  47 }
  48 
  49 static __u32 crush_hash32_rjenkins1_3(__u32 a, __u32 b, __u32 c)
  50 {
  51         __u32 hash = crush_hash_seed ^ a ^ b ^ c;
  52         __u32 x = 231232;
  53         __u32 y = 1232;
  54         crush_hashmix(a, b, hash);
  55         crush_hashmix(c, x, hash);
  56         crush_hashmix(y, a, hash);
  57         crush_hashmix(b, x, hash);
  58         crush_hashmix(y, c, hash);
  59         return hash;
  60 }
  61 
  62 static __u32 crush_hash32_rjenkins1_4(__u32 a, __u32 b, __u32 c, __u32 d)
  63 {
  64         __u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d;
  65         __u32 x = 231232;
  66         __u32 y = 1232;
  67         crush_hashmix(a, b, hash);
  68         crush_hashmix(c, d, hash);
  69         crush_hashmix(a, x, hash);
  70         crush_hashmix(y, b, hash);
  71         crush_hashmix(c, x, hash);
  72         crush_hashmix(y, d, hash);
  73         return hash;
  74 }
  75 
  76 static __u32 crush_hash32_rjenkins1_5(__u32 a, __u32 b, __u32 c, __u32 d,
  77                                       __u32 e)
  78 {
  79         __u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d ^ e;
  80         __u32 x = 231232;
  81         __u32 y = 1232;
  82         crush_hashmix(a, b, hash);
  83         crush_hashmix(c, d, hash);
  84         crush_hashmix(e, x, hash);
  85         crush_hashmix(y, a, hash);
  86         crush_hashmix(b, x, hash);
  87         crush_hashmix(y, c, hash);
  88         crush_hashmix(d, x, hash);
  89         crush_hashmix(y, e, hash);
  90         return hash;
  91 }
  92 
  93 
  94 __u32 crush_hash32(int type, __u32 a)
  95 {
  96         switch (type) {
  97         case CRUSH_HASH_RJENKINS1:
  98                 return crush_hash32_rjenkins1(a);
  99         default:
 100                 return 0;
 101         }
 102 }
 103 
 104 __u32 crush_hash32_2(int type, __u32 a, __u32 b)
 105 {
 106         switch (type) {
 107         case CRUSH_HASH_RJENKINS1:
 108                 return crush_hash32_rjenkins1_2(a, b);
 109         default:
 110                 return 0;
 111         }
 112 }
 113 
 114 __u32 crush_hash32_3(int type, __u32 a, __u32 b, __u32 c)
 115 {
 116         switch (type) {
 117         case CRUSH_HASH_RJENKINS1:
 118                 return crush_hash32_rjenkins1_3(a, b, c);
 119         default:
 120                 return 0;
 121         }
 122 }
 123 
 124 __u32 crush_hash32_4(int type, __u32 a, __u32 b, __u32 c, __u32 d)
 125 {
 126         switch (type) {
 127         case CRUSH_HASH_RJENKINS1:
 128                 return crush_hash32_rjenkins1_4(a, b, c, d);
 129         default:
 130                 return 0;
 131         }
 132 }
 133 
 134 __u32 crush_hash32_5(int type, __u32 a, __u32 b, __u32 c, __u32 d, __u32 e)
 135 {
 136         switch (type) {
 137         case CRUSH_HASH_RJENKINS1:
 138                 return crush_hash32_rjenkins1_5(a, b, c, d, e);
 139         default:
 140                 return 0;
 141         }
 142 }
 143 
 144 const char *crush_hash_name(int type)
 145 {
 146         switch (type) {
 147         case CRUSH_HASH_RJENKINS1:
 148                 return "rjenkins1";
 149         default:
 150                 return "unknown";
 151         }
 152 }

/* [<][>][^][v][top][bottom][index][help] */