MCPcopy Create free account
hub / github.com/F-Stack/f-stack / siphash

Function siphash

app/redis-6.2.6/src/siphash.c:116–173  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

114 } while (0)
115
116uint64_t siphash(const uint8_t *in, const size_t inlen, const uint8_t *k) {
117#ifndef UNALIGNED_LE_CPU
118 uint64_t hash;
119 uint8_t *out = (uint8_t*) &hash;
120#endif
121 uint64_t v0 = 0x736f6d6570736575ULL;
122 uint64_t v1 = 0x646f72616e646f6dULL;
123 uint64_t v2 = 0x6c7967656e657261ULL;
124 uint64_t v3 = 0x7465646279746573ULL;
125 uint64_t k0 = U8TO64_LE(k);
126 uint64_t k1 = U8TO64_LE(k + 8);
127 uint64_t m;
128 const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t));
129 const int left = inlen & 7;
130 uint64_t b = ((uint64_t)inlen) << 56;
131 v3 ^= k1;
132 v2 ^= k0;
133 v1 ^= k1;
134 v0 ^= k0;
135
136 for (; in != end; in += 8) {
137 m = U8TO64_LE(in);
138 v3 ^= m;
139
140 SIPROUND;
141
142 v0 ^= m;
143 }
144
145 switch (left) {
146 case 7: b |= ((uint64_t)in[6]) << 48; /* fall-thru */
147 case 6: b |= ((uint64_t)in[5]) << 40; /* fall-thru */
148 case 5: b |= ((uint64_t)in[4]) << 32; /* fall-thru */
149 case 4: b |= ((uint64_t)in[3]) << 24; /* fall-thru */
150 case 3: b |= ((uint64_t)in[2]) << 16; /* fall-thru */
151 case 2: b |= ((uint64_t)in[1]) << 8; /* fall-thru */
152 case 1: b |= ((uint64_t)in[0]); break;
153 case 0: break;
154 }
155
156 v3 ^= b;
157
158 SIPROUND;
159
160 v0 ^= b;
161 v2 ^= 0xff;
162
163 SIPROUND;
164 SIPROUND;
165
166 b = v0 ^ v1 ^ v2 ^ v3;
167#ifndef UNALIGNED_LE_CPU
168 U64TO8_LE(out, b);
169 return hash;
170#else
171 return b;
172#endif
173}

Callers 2

dictGenHashFunctionFunction · 0.85
siphash_testFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected