| 206 | } |
| 207 | |
| 208 | uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra) |
| 209 | { |
| 210 | /* Specialized implementation for efficiency */ |
| 211 | uint64_t d = val.GetUint64(0); |
| 212 | |
| 213 | uint64_t v0 = 0x736f6d6570736575ULL ^ k0; |
| 214 | uint64_t v1 = 0x646f72616e646f6dULL ^ k1; |
| 215 | uint64_t v2 = 0x6c7967656e657261ULL ^ k0; |
| 216 | uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; |
| 217 | |
| 218 | SIPROUND; |
| 219 | SIPROUND; |
| 220 | v0 ^= d; |
| 221 | d = val.GetUint64(1); |
| 222 | v3 ^= d; |
| 223 | SIPROUND; |
| 224 | SIPROUND; |
| 225 | v0 ^= d; |
| 226 | d = val.GetUint64(2); |
| 227 | v3 ^= d; |
| 228 | SIPROUND; |
| 229 | SIPROUND; |
| 230 | v0 ^= d; |
| 231 | d = val.GetUint64(3); |
| 232 | v3 ^= d; |
| 233 | SIPROUND; |
| 234 | SIPROUND; |
| 235 | v0 ^= d; |
| 236 | d = (((uint64_t)36) << 56) | extra; |
| 237 | v3 ^= d; |
| 238 | SIPROUND; |
| 239 | SIPROUND; |
| 240 | v0 ^= d; |
| 241 | v2 ^= 0xFF; |
| 242 | SIPROUND; |
| 243 | SIPROUND; |
| 244 | SIPROUND; |
| 245 | SIPROUND; |
| 246 | return v0 ^ v1 ^ v2 ^ v3; |
| 247 | } |