| 74 | //----------------------------------------------------------------------------- |
| 75 | |
| 76 | Hash GenerateHash(const void* key, const int len, const uint32_t seed) |
| 77 | { |
| 78 | const uint8_t * data = (const uint8_t*)key; |
| 79 | const int nblocks = len / 16; |
| 80 | |
| 81 | uint64_t h1 = seed; |
| 82 | uint64_t h2 = seed; |
| 83 | |
| 84 | const uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5); |
| 85 | const uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f); |
| 86 | |
| 87 | //---------- |
| 88 | // body |
| 89 | |
| 90 | const uint64_t * blocks = (const uint64_t *)(data); |
| 91 | |
| 92 | for(int i = 0; i < nblocks; i++) |
| 93 | { |
| 94 | uint64_t k1 = getblock(blocks,i*2+0); |
| 95 | uint64_t k2 = getblock(blocks,i*2+1); |
| 96 | |
| 97 | k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; |
| 98 | |
| 99 | h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729; |
| 100 | |
| 101 | k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; |
| 102 | |
| 103 | h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5; |
| 104 | } |
| 105 | |
| 106 | //---------- |
| 107 | // tail |
| 108 | |
| 109 | const uint8_t * tail = (const uint8_t*)(data + nblocks*16); |
| 110 | |
| 111 | uint64_t k1 = 0; |
| 112 | uint64_t k2 = 0; |
| 113 | |
| 114 | switch(len & 15) |
| 115 | { |
| 116 | case 15: k2 ^= uint64_t(tail[14]) << 48; |
| 117 | case 14: k2 ^= uint64_t(tail[13]) << 40; |
| 118 | case 13: k2 ^= uint64_t(tail[12]) << 32; |
| 119 | case 12: k2 ^= uint64_t(tail[11]) << 24; |
| 120 | case 11: k2 ^= uint64_t(tail[10]) << 16; |
| 121 | case 10: k2 ^= uint64_t(tail[ 9]) << 8; |
| 122 | case 9: k2 ^= uint64_t(tail[ 8]) << 0; |
| 123 | k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; |
| 124 | |
| 125 | case 8: k1 ^= uint64_t(tail[ 7]) << 56; |
| 126 | case 7: k1 ^= uint64_t(tail[ 6]) << 48; |
| 127 | case 6: k1 ^= uint64_t(tail[ 5]) << 40; |
| 128 | case 5: k1 ^= uint64_t(tail[ 4]) << 32; |
| 129 | case 4: k1 ^= uint64_t(tail[ 3]) << 24; |
| 130 | case 3: k1 ^= uint64_t(tail[ 2]) << 16; |
| 131 | case 2: k1 ^= uint64_t(tail[ 1]) << 8; |
| 132 | case 1: k1 ^= uint64_t(tail[ 0]) << 0; |
| 133 | k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; |
no test coverage detected