| 173 | } |
| 174 | |
| 175 | uint64_t siphash_nocase(const uint8_t *in, const size_t inlen, const uint8_t *k) |
| 176 | { |
| 177 | #ifndef UNALIGNED_LE_CPU |
| 178 | uint64_t hash; |
| 179 | uint8_t *out = (uint8_t*) &hash; |
| 180 | #endif |
| 181 | uint64_t v0 = 0x736f6d6570736575ULL; |
| 182 | uint64_t v1 = 0x646f72616e646f6dULL; |
| 183 | uint64_t v2 = 0x6c7967656e657261ULL; |
| 184 | uint64_t v3 = 0x7465646279746573ULL; |
| 185 | uint64_t k0 = U8TO64_LE(k); |
| 186 | uint64_t k1 = U8TO64_LE(k + 8); |
| 187 | uint64_t m; |
| 188 | const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t)); |
| 189 | const int left = inlen & 7; |
| 190 | uint64_t b = ((uint64_t)inlen) << 56; |
| 191 | v3 ^= k1; |
| 192 | v2 ^= k0; |
| 193 | v1 ^= k1; |
| 194 | v0 ^= k0; |
| 195 | |
| 196 | for (; in != end; in += 8) { |
| 197 | m = U8TO64_LE_NOCASE(in); |
| 198 | v3 ^= m; |
| 199 | |
| 200 | SIPROUND; |
| 201 | |
| 202 | v0 ^= m; |
| 203 | } |
| 204 | |
| 205 | switch (left) { |
| 206 | case 7: b |= ((uint64_t)siptlw(in[6])) << 48; /* fall-thru */ |
| 207 | case 6: b |= ((uint64_t)siptlw(in[5])) << 40; /* fall-thru */ |
| 208 | case 5: b |= ((uint64_t)siptlw(in[4])) << 32; /* fall-thru */ |
| 209 | case 4: b |= ((uint64_t)siptlw(in[3])) << 24; /* fall-thru */ |
| 210 | case 3: b |= ((uint64_t)siptlw(in[2])) << 16; /* fall-thru */ |
| 211 | case 2: b |= ((uint64_t)siptlw(in[1])) << 8; /* fall-thru */ |
| 212 | case 1: b |= ((uint64_t)siptlw(in[0])); break; |
| 213 | case 0: break; |
| 214 | } |
| 215 | |
| 216 | v3 ^= b; |
| 217 | |
| 218 | SIPROUND; |
| 219 | |
| 220 | v0 ^= b; |
| 221 | v2 ^= 0xff; |
| 222 | |
| 223 | SIPROUND; |
| 224 | SIPROUND; |
| 225 | |
| 226 | b = v0 ^ v1 ^ v2 ^ v3; |
| 227 | #ifndef UNALIGNED_LE_CPU |
| 228 | U64TO8_LE(out, b); |
| 229 | return hash; |
| 230 | #else |
| 231 | return b; |
| 232 | #endif |
no test coverage detected