Guest User

Untitled

a guest
Nov 23rd, 2014
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. int ComputeHash(const char *upper, unsigned int len, int zero) {
  2.     unsigned int orig_len = len;
  3.     unsigned int h0 = 0x9E3779B9;
  4.     unsigned int h3 = h0;
  5.     unsigned int ch0;
  6.     unsigned int ch1;
  7.     ch1 = len;
  8.     if (len >= 12) {
  9.         //should be 0xAAAAAAAB as an unsigned long long and multiplied by len, then the hi dword is taken and shifted left 3
  10.         unsigned int h1 = 0xAAAA;
  11.         unsigned int h2 = 0xAAAB;
  12.         h1 *= len;
  13.         h2 *= len;
  14.         h2 >>= 0x10;
  15.         h1 += h2;
  16.         h1 >>= 0x13;
  17.         unsigned int k = h1;
  18.         p1:;
  19.         ch0 = upper[7];
  20.         ch1 = upper[6];
  21.         ch0 <<= 8;
  22.         ch0 += ch1;
  23.         ch1 = upper[5];
  24.         ch0 <<= 8;
  25.         ch0 += ch1;
  26.         ch1 = upper[4];
  27.         ch1 += h0;
  28.         ch0 <<= 8;
  29.         h0 = ch0 + ch1;
  30.         ch0 = upper[11];
  31.         ch1 = upper[10];
  32.         ch0 <<= 8;
  33.         ch0 += ch1;
  34.         ch1 = upper[9];
  35.         ch0 <<= 8;
  36.         ch0 += ch1;
  37.         ch1 = upper[8];
  38.         ch1 += zero;
  39.         ch0 <<= 8;
  40.         zero = ch0 + ch1;
  41.         ch0 = upper[3];
  42.         ch1 = upper[2];
  43.         ch0 <<= 8;
  44.         ch0 += ch1;
  45.         ch1 = upper[1];
  46.         ch0 <<= 8;
  47.         ch0 += ch1;
  48.         ch1 = upper[0];
  49.         ch0 <<= 8;
  50.         ch0 += ch1;
  51.         ch0 -= zero;
  52.         ch0 -= h0;
  53.         h0 -= zero;
  54.         ch1 = zero;
  55.         ch1 >>= 0x0D;
  56.         ch0 += h3;
  57.         ch0 ^= ch1;
  58.         h0 -= ch0;
  59.         ch1 = ch0;
  60.         ch1 <<= 8;
  61.         h0 ^= ch1;
  62.         zero -= h0;
  63.         zero -= ch0;
  64.         ch1 = h0;
  65.         ch1 >>= 0x0D;
  66.         zero ^= ch1;
  67.         ch0 -= zero;
  68.         ch0 -= h0;
  69.         ch1 = zero;
  70.         ch1 >>= 0x0C;
  71.         ch0 ^= ch1;
  72.         h0 -= zero;
  73.         h0 -= ch0;
  74.         ch1 = ch0;
  75.         ch1 <<= 0x10;
  76.         h0 ^= ch1;
  77.         zero -= h0;
  78.         zero -= ch0;
  79.         ch1 = h0;
  80.         ch1 >>= 0x5;
  81.         zero ^= ch1;
  82.         ch0 -= zero;
  83.         ch0 -= h0;
  84.         ch1 = zero;
  85.         ch1 >>= 0x03;
  86.         ch0 ^= ch1;
  87.         h0 -= zero;
  88.         h3 = ch0;
  89.         h0 -= h3;
  90.         ch0 <<= 0x0A;
  91.         h0 ^= ch0;
  92.         zero -= h0;
  93.         ch1 = h0;
  94.         zero -= h3;
  95.         ch1 >>= 0x0F;
  96.         zero ^= ch1;
  97.         upper += 0x0C;
  98.         len -= 0x0C;
  99.         k--;
  100.         if (k != 0)
  101.             goto p1;
  102.         ch1 = orig_len;
  103.     }
  104.     len--;
  105.     zero += ch1;
  106.     switch (len) {
  107.         case 10:
  108.         ch0 = upper[10];
  109.         ch0 <<= 0x18;
  110.         zero += ch0;
  111.         case 9:
  112.         ch1 = upper[9];
  113.         ch1 <<= 0x10;
  114.         zero += ch1;
  115.         case 8:
  116.         ch0 = upper[8];
  117.         ch0 <<= 0x08;
  118.         zero += ch0;
  119.         case 7:
  120.         ch1 = upper[7];
  121.         ch1 <<= 0x18;
  122.         h0 += ch1;
  123.         case 6:
  124.         ch0 = upper[6];
  125.         ch0 <<= 0x10;
  126.         h0 += ch0;
  127.         case 5:
  128.         ch1 = upper[5];
  129.         ch1 <<= 0x08;
  130.         h0 += ch1;
  131.         case 4:
  132.         ch0 = upper[4];
  133.         h0 += ch0;
  134.         case 3:
  135.         ch1 = upper[3];
  136.         ch1 <<= 0x18;
  137.         h3 += ch1;
  138.         case 2:
  139.         ch0 = upper[2];
  140.         ch0 <<= 0x10;
  141.         h3 += ch0;
  142.         case 1:
  143.         ch1 = upper[1];
  144.         ch1 <<= 0x08;
  145.         h3 += ch1;
  146.         case 0:
  147.         ch0 = upper[0];
  148.         h3 += ch0;
  149.         default:
  150.         unsigned int c;
  151.         h3 -= zero;
  152.         h3 -= h0;
  153.         h0 -= zero;
  154.         c = zero;
  155.         c >>= 0x0D;
  156.         h3 ^= c;
  157.         h0 -= h3;
  158.         ch1 = h3;
  159.         ch1 <<= 0x08;
  160.         h0 ^= ch1;
  161.         zero -= h0;
  162.         zero -= h3;
  163.         ch0 = h0;
  164.         ch0 >>= 0x0D;
  165.         zero ^= ch0;
  166.         h3 -= zero;
  167.         h3 -= h0;
  168.         h0 -= zero;
  169.         c = zero;
  170.         c >>= 0x0C;
  171.         h3 ^= c;
  172.         h0 -= h3;
  173.         ch1 = h3;
  174.         ch1 <<= 0x10;
  175.         h0 ^= ch1;
  176.         zero -= h0;
  177.         ch0 = h0;
  178.         zero -= h3;
  179.         ch0 >>= 0x05;
  180.         zero ^= ch0;
  181.         ch0 = zero;
  182.         h3 -= ch0;
  183.         h3 -= h0;
  184.         c = ch0;
  185.         h0 -= ch0;
  186.         c >>= 0x03;
  187.         h3 ^= c;
  188.         h0 -= h3;
  189.         ch1 = h3;
  190.         ch1 <<= 0x0A;
  191.         h0 ^= ch1;
  192.         ch0 -= h0;
  193.         ch0 -= h3;
  194.         h0 >>= 0x0F;
  195.         ch0 ^= h0;
  196.     }
  197.     return ch0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment