| 92 | } |
| 93 | |
| 94 | uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val) |
| 95 | { |
| 96 | /* Specialized implementation for efficiency */ |
| 97 | uint64_t d = val.GetUint64(0); |
| 98 | |
| 99 | uint64_t v0 = 0x736f6d6570736575ULL ^ k0; |
| 100 | uint64_t v1 = 0x646f72616e646f6dULL ^ k1; |
| 101 | uint64_t v2 = 0x6c7967656e657261ULL ^ k0; |
| 102 | uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; |
| 103 | |
| 104 | SIPROUND; |
| 105 | SIPROUND; |
| 106 | v0 ^= d; |
| 107 | d = val.GetUint64(1); |
| 108 | v3 ^= d; |
| 109 | SIPROUND; |
| 110 | SIPROUND; |
| 111 | v0 ^= d; |
| 112 | d = val.GetUint64(2); |
| 113 | v3 ^= d; |
| 114 | SIPROUND; |
| 115 | SIPROUND; |
| 116 | v0 ^= d; |
| 117 | d = val.GetUint64(3); |
| 118 | v3 ^= d; |
| 119 | SIPROUND; |
| 120 | SIPROUND; |
| 121 | v0 ^= d; |
| 122 | v3 ^= ((uint64_t)4) << 59; |
| 123 | SIPROUND; |
| 124 | SIPROUND; |
| 125 | v0 ^= ((uint64_t)4) << 59; |
| 126 | v2 ^= 0xFF; |
| 127 | SIPROUND; |
| 128 | SIPROUND; |
| 129 | SIPROUND; |
| 130 | SIPROUND; |
| 131 | return v0 ^ v1 ^ v2 ^ v3; |
| 132 | } |
| 133 | |
| 134 | uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra) |
| 135 | { |