| 132 | } |
| 133 | |
| 134 | uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra) |
| 135 | { |
| 136 | /* Specialized implementation for efficiency */ |
| 137 | uint64_t d = val.GetUint64(0); |
| 138 | |
| 139 | uint64_t v0 = 0x736f6d6570736575ULL ^ k0; |
| 140 | uint64_t v1 = 0x646f72616e646f6dULL ^ k1; |
| 141 | uint64_t v2 = 0x6c7967656e657261ULL ^ k0; |
| 142 | uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; |
| 143 | |
| 144 | SIPROUND; |
| 145 | SIPROUND; |
| 146 | v0 ^= d; |
| 147 | d = val.GetUint64(1); |
| 148 | v3 ^= d; |
| 149 | SIPROUND; |
| 150 | SIPROUND; |
| 151 | v0 ^= d; |
| 152 | d = val.GetUint64(2); |
| 153 | v3 ^= d; |
| 154 | SIPROUND; |
| 155 | SIPROUND; |
| 156 | v0 ^= d; |
| 157 | d = val.GetUint64(3); |
| 158 | v3 ^= d; |
| 159 | SIPROUND; |
| 160 | SIPROUND; |
| 161 | v0 ^= d; |
| 162 | d = (((uint64_t)36) << 56) | extra; |
| 163 | v3 ^= d; |
| 164 | SIPROUND; |
| 165 | SIPROUND; |
| 166 | v0 ^= d; |
| 167 | v2 ^= 0xFF; |
| 168 | SIPROUND; |
| 169 | SIPROUND; |
| 170 | SIPROUND; |
| 171 | SIPROUND; |
| 172 | return v0 ^ v1 ^ v2 ^ v3; |
| 173 | } |