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
24static __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
35static __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
46static __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
59static __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
73static __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
141const 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