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