Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int ComputeHash(const char *upper, unsigned int len, int zero) {
- unsigned int orig_len = len;
- unsigned int h0 = 0x9E3779B9;
- unsigned int h3 = h0;
- unsigned int ch0;
- unsigned int ch1;
- ch1 = len;
- if (len >= 12) {
- //should be 0xAAAAAAAB as an unsigned long long and multiplied by len, then the hi dword is taken and shifted left 3
- unsigned int h1 = 0xAAAA;
- unsigned int h2 = 0xAAAB;
- h1 *= len;
- h2 *= len;
- h2 >>= 0x10;
- h1 += h2;
- h1 >>= 0x13;
- unsigned int k = h1;
- p1:;
- ch0 = upper[7];
- ch1 = upper[6];
- ch0 <<= 8;
- ch0 += ch1;
- ch1 = upper[5];
- ch0 <<= 8;
- ch0 += ch1;
- ch1 = upper[4];
- ch1 += h0;
- ch0 <<= 8;
- h0 = ch0 + ch1;
- ch0 = upper[11];
- ch1 = upper[10];
- ch0 <<= 8;
- ch0 += ch1;
- ch1 = upper[9];
- ch0 <<= 8;
- ch0 += ch1;
- ch1 = upper[8];
- ch1 += zero;
- ch0 <<= 8;
- zero = ch0 + ch1;
- ch0 = upper[3];
- ch1 = upper[2];
- ch0 <<= 8;
- ch0 += ch1;
- ch1 = upper[1];
- ch0 <<= 8;
- ch0 += ch1;
- ch1 = upper[0];
- ch0 <<= 8;
- ch0 += ch1;
- ch0 -= zero;
- ch0 -= h0;
- h0 -= zero;
- ch1 = zero;
- ch1 >>= 0x0D;
- ch0 += h3;
- ch0 ^= ch1;
- h0 -= ch0;
- ch1 = ch0;
- ch1 <<= 8;
- h0 ^= ch1;
- zero -= h0;
- zero -= ch0;
- ch1 = h0;
- ch1 >>= 0x0D;
- zero ^= ch1;
- ch0 -= zero;
- ch0 -= h0;
- ch1 = zero;
- ch1 >>= 0x0C;
- ch0 ^= ch1;
- h0 -= zero;
- h0 -= ch0;
- ch1 = ch0;
- ch1 <<= 0x10;
- h0 ^= ch1;
- zero -= h0;
- zero -= ch0;
- ch1 = h0;
- ch1 >>= 0x5;
- zero ^= ch1;
- ch0 -= zero;
- ch0 -= h0;
- ch1 = zero;
- ch1 >>= 0x03;
- ch0 ^= ch1;
- h0 -= zero;
- h3 = ch0;
- h0 -= h3;
- ch0 <<= 0x0A;
- h0 ^= ch0;
- zero -= h0;
- ch1 = h0;
- zero -= h3;
- ch1 >>= 0x0F;
- zero ^= ch1;
- upper += 0x0C;
- len -= 0x0C;
- k--;
- if (k != 0)
- goto p1;
- ch1 = orig_len;
- }
- len--;
- zero += ch1;
- switch (len) {
- case 10:
- ch0 = upper[10];
- ch0 <<= 0x18;
- zero += ch0;
- case 9:
- ch1 = upper[9];
- ch1 <<= 0x10;
- zero += ch1;
- case 8:
- ch0 = upper[8];
- ch0 <<= 0x08;
- zero += ch0;
- case 7:
- ch1 = upper[7];
- ch1 <<= 0x18;
- h0 += ch1;
- case 6:
- ch0 = upper[6];
- ch0 <<= 0x10;
- h0 += ch0;
- case 5:
- ch1 = upper[5];
- ch1 <<= 0x08;
- h0 += ch1;
- case 4:
- ch0 = upper[4];
- h0 += ch0;
- case 3:
- ch1 = upper[3];
- ch1 <<= 0x18;
- h3 += ch1;
- case 2:
- ch0 = upper[2];
- ch0 <<= 0x10;
- h3 += ch0;
- case 1:
- ch1 = upper[1];
- ch1 <<= 0x08;
- h3 += ch1;
- case 0:
- ch0 = upper[0];
- h3 += ch0;
- default:
- unsigned int c;
- h3 -= zero;
- h3 -= h0;
- h0 -= zero;
- c = zero;
- c >>= 0x0D;
- h3 ^= c;
- h0 -= h3;
- ch1 = h3;
- ch1 <<= 0x08;
- h0 ^= ch1;
- zero -= h0;
- zero -= h3;
- ch0 = h0;
- ch0 >>= 0x0D;
- zero ^= ch0;
- h3 -= zero;
- h3 -= h0;
- h0 -= zero;
- c = zero;
- c >>= 0x0C;
- h3 ^= c;
- h0 -= h3;
- ch1 = h3;
- ch1 <<= 0x10;
- h0 ^= ch1;
- zero -= h0;
- ch0 = h0;
- zero -= h3;
- ch0 >>= 0x05;
- zero ^= ch0;
- ch0 = zero;
- h3 -= ch0;
- h3 -= h0;
- c = ch0;
- h0 -= ch0;
- c >>= 0x03;
- h3 ^= c;
- h0 -= h3;
- ch1 = h3;
- ch1 <<= 0x0A;
- h0 ^= ch1;
- ch0 -= h0;
- ch0 -= h3;
- h0 >>= 0x0F;
- ch0 ^= h0;
- }
- return ch0;
- }
Advertisement
Add Comment
Please, Sign In to add comment