static uint32_t hash(const char *key, uint32_t len, uint32_t seed) { static const uint32_t c1 = 0xcc9e2d51; static const uint32_t c2 = 0x1b873593; static const uint32_t r1 = 15; static const uint32_t r2 = 13; static const uint32_t m = 5; static const uint32_t n = 0xe6546b64; uint32_t hash = seed; const int nblocks = len / 4; const uint32_t *blocks = (const uint32_t *) key; int i; uint32_t k; for (i = 0; i < nblocks; i++) { k = blocks[i]; k *= c1; k = ROT32(k, r1); k *= c2; hash ^= k; hash = ROT32(hash, r2) * m + n; } const uint8_t *tail = (const uint8_t *) (key + nblocks * 4); uint32_t k1 = 0; switch (len & 3) { case 3: k1 ^= tail[2] << 16; case 2: k1 ^= tail[1] << 8; case 1: k1 ^= tail[0]; k1 *= c1; k1 = ROT32(k1, r1); k1 *= c2; hash ^= k1; } hash ^= len; hash ^= (hash >> 16); hash *= 0x85ebca6b; hash ^= (hash >> 13); hash *= 0xc2b2ae35; hash ^= (hash >> 16); return hash; }
int main() { int b; unsigned long temp; unsigned long Aout, Bout, Cout, Dout, Eout; unsigned long data[NUM_BLOCKS][16]; Aout = 0x67452301L; Bout = 0xefcdab89L; Cout = 0x98badcfeL; Dout = 0x10325476L; Eout = 0xc3d2e1f0L; /* initialize the data to something random */ for (b = 0; b < NUM_BLOCKS; b++) { int j; for (j = 0; j < 16; j++) { data[b][j] = b+j; } } /* here's the transformation */ for (b = 0; b < NUM_BLOCKS; b++) { unsigned long A0 = Aout; unsigned long A1 = Bout; unsigned long A2 = Cout; unsigned long A3 = Dout; unsigned long A4 = Eout; unsigned long W0 = data[b][0]; unsigned long W1 = data[b][1]; unsigned long W2 = data[b][2]; unsigned long W3 = data[b][3]; unsigned long W4 = data[b][4]; unsigned long W5 = data[b][5]; unsigned long W6 = data[b][6]; unsigned long W7 = data[b][7]; unsigned long W8 = data[b][8]; unsigned long W9 = data[b][9]; unsigned long W10 = data[b][10]; unsigned long W11 = data[b][11]; unsigned long W12 = data[b][12]; unsigned long W13 = data[b][13]; unsigned long W14 = data[b][14]; unsigned long W15 = data[b][15]; unsigned long the_const; the_const = CONST0; A4 = ROT32(A0,5) + f0(A1,A2,A3) + A4 + W0 + the_const; A1 = ROT32(A1,30); A3 = ROT32(A4,5) + f0(A0,A1,A2) + A3 + W1 + the_const; A0 = ROT32(A0,30); A2 = ROT32(A3,5) + f0(A4,A0,A1) + A2 + W2 + the_const; A4 = ROT32(A4,30); A1 = ROT32(A2,5) + f0(A3,A4,A0) + A1 + W3 + the_const; A3 = ROT32(A3,30); A0 = ROT32(A1,5) + f0(A2,A3,A4) + A0 + W4 + the_const; A2 = ROT32(A2,30); A4 = ROT32(A0,5) + f0(A1,A2,A3) + A4 + W5 + the_const; A1 = ROT32(A1,30); A3 = ROT32(A4,5) + f0(A0,A1,A2) + A3 + W6 + the_const; A0 = ROT32(A0,30); A2 = ROT32(A3,5) + f0(A4,A0,A1) + A2 + W7 + the_const; A4 = ROT32(A4,30); A1 = ROT32(A2,5) + f0(A3,A4,A0) + A1 + W8 + the_const; A3 = ROT32(A3,30); A0 = ROT32(A1,5) + f0(A2,A3,A4) + A0 + W9 + the_const; A2 = ROT32(A2,30); A4 = ROT32(A0,5) + f0(A1,A2,A3) + A4 + W10 + the_const; A1 = ROT32(A1,30); A3 = ROT32(A4,5) + f0(A0,A1,A2) + A3 + W11 + the_const; A0 = ROT32(A0,30); A2 = ROT32(A3,5) + f0(A4,A0,A1) + A2 + W12 + the_const; A4 = ROT32(A4,30); A1 = ROT32(A2,5) + f0(A3,A4,A0) + A1 + W13 + the_const; A3 = ROT32(A3,30); A0 = ROT32(A1,5) + f0(A2,A3,A4) + A0 + W14 + the_const; A2 = ROT32(A2,30); A4 = ROT32(A0,5) + f0(A1,A2,A3) + A4 + W15 + the_const; A1 = ROT32(A1,30); W0 ^= W13; W0 ^= W8; W0 ^= W2; W0 = ROT32(W0,1); A3 = ROT32(A4,5) + f0(A0,A1,A2) + A3 + W0 + the_const; A0 = ROT32(A0,30); W1 ^= W14; W1 ^= W9; W1 ^= W3; W1 = ROT32(W1,1); A2 = ROT32(A3,5) + f0(A4,A0,A1) + A2 + W1 + the_const; A4 = ROT32(A4,30); W2 ^= W15; W2 ^= W10; W2 ^= W4; W2 = ROT32(W2,1); A1 = ROT32(A2,5) + f0(A3,A4,A0) + A1 + W2 + the_const; A3 = ROT32(A3,30); W3 ^= W0; W3 ^= W11; W3 ^= W5; W3 = ROT32(W3,1); A0 = ROT32(A1,5) + f0(A2,A3,A4) + A0 + W3 + the_const; A2 = ROT32(A2,30); the_const = CONST1; W4 ^= W1; W4 ^= W12; W4 ^= W6; W4 = ROT32(W4,1); A4 = ROT32(A0,5) + f1(A1,A2,A3) + A4 + W4 + the_const; A1 = ROT32(A1,30); W5 ^= W2; W5 ^= W13; W5 ^= W7; W5 = ROT32(W5,1); A3 = ROT32(A4,5) + f1(A0,A1,A2) + A3 + W5 + the_const; A0 = ROT32(A0,30); W6 ^= W3; W6 ^= W14; W6 ^= W8; W6 = ROT32(W6,1); A2 = ROT32(A3,5) + f1(A4,A0,A1) + A2 + W6 + the_const; A4 = ROT32(A4,30); W7 ^= W4; W7 ^= W15; W7 ^= W9; W7 = ROT32(W7,1); A1 = ROT32(A2,5) + f1(A3,A4,A0) + A1 + W7 + the_const; A3 = ROT32(A3,30); W8 ^= W5; W8 ^= W0; W8 ^= W10; W8 = ROT32(W8,1); A0 = ROT32(A1,5) + f1(A2,A3,A4) + A0 + W8 + the_const; A2 = ROT32(A2,30); W9 ^= W6; W9 ^= W1; W9 ^= W11; W9 = ROT32(W9,1); A4 = ROT32(A0,5) + f1(A1,A2,A3) + A4 + W9 + the_const; A1 = ROT32(A1,30); W10 ^= W7; W10 ^= W2; W10 ^= W12; W10 = ROT32(W10,1); A3 = ROT32(A4,5) + f1(A0,A1,A2) + A3 + W10 + the_const; A0 = ROT32(A0,30); W11 ^= W8; W11 ^= W3; W11 ^= W13; W11 = ROT32(W11,1); A2 = ROT32(A3,5) + f1(A4,A0,A1) + A2 + W11 + the_const; A4 = ROT32(A4,30); W12 ^= W9; W12 ^= W4; W12 ^= W14; W12 = ROT32(W12,1); A1 = ROT32(A2,5) + f1(A3,A4,A0) + A1 + W12 + the_const; A3 = ROT32(A3,30); W13 ^= W10; W13 ^= W5; W13 ^= W15; W13 = ROT32(W13,1); A0 = ROT32(A1,5) + f1(A2,A3,A4) + A0 + W13 + the_const; A2 = ROT32(A2,30); W14 ^= W11; W14 ^= W6; W14 ^= W0; W14 = ROT32(W14,1); A4 = ROT32(A0,5) + f1(A1,A2,A3) + A4 + W14 + the_const; A1 = ROT32(A1,30); W15 ^= W12; W15 ^= W7; W15 ^= W1; W15 = ROT32(W15,1); A3 = ROT32(A4,5) + f1(A0,A1,A2) + A3 + W15 + the_const; A0 = ROT32(A0,30); W0 ^= W13; W0 ^= W8; W0 ^= W2; W0 = ROT32(W0,1); A2 = ROT32(A3,5) + f1(A4,A0,A1) + A2 + W0 + the_const; A4 = ROT32(A4,30); W1 ^= W14; W1 ^= W9; W1 ^= W3; W1 = ROT32(W1,1); A1 = ROT32(A2,5) + f1(A3,A4,A0) + A1 + W1 + the_const; A3 = ROT32(A3,30); W2 ^= W15; W2 ^= W10; W2 ^= W4; W2 = ROT32(W2,1); A0 = ROT32(A1,5) + f1(A2,A3,A4) + A0 + W2 + the_const; A2 = ROT32(A2,30); W3 ^= W0; W3 ^= W11; W3 ^= W5; W3 = ROT32(W3,1); A4 = ROT32(A0,5) + f1(A1,A2,A3) + A4 + W3 + the_const; A1 = ROT32(A1,30); W4 ^= W1; W4 ^= W12; W4 ^= W6; W4 = ROT32(W4,1); A3 = ROT32(A4,5) + f1(A0,A1,A2) + A3 + W4 + the_const; A0 = ROT32(A0,30); W5 ^= W2; W5 ^= W13; W5 ^= W7; W5 = ROT32(W5,1); A2 = ROT32(A3,5) + f1(A4,A0,A1) + A2 + W5 + the_const; A4 = ROT32(A4,30); W6 ^= W3; W6 ^= W14; W6 ^= W8; W6 = ROT32(W6,1); A1 = ROT32(A2,5) + f1(A3,A4,A0) + A1 + W6 + the_const; A3 = ROT32(A3,30); W7 ^= W4; W7 ^= W15; W7 ^= W9; W7 = ROT32(W7,1); A0 = ROT32(A1,5) + f1(A2,A3,A4) + A0 + W7 + the_const; A2 = ROT32(A2,30); the_const = CONST2; W8 ^= W5; W8 ^= W0; W8 ^= W10; W8 = ROT32(W8,1); A4 = ROT32(A0,5) + f2(A1,A2,A3) + A4 + W8 + the_const; A1 = ROT32(A1,30); W9 ^= W6; W9 ^= W1; W9 ^= W11; W9 = ROT32(W9,1); A3 = ROT32(A4,5) + f2(A0,A1,A2) + A3 + W9 + the_const; A0 = ROT32(A0,30); W10 ^= W7; W10 ^= W2; W10 ^= W12; W10 = ROT32(W10,1); A2 = ROT32(A3,5) + f2(A4,A0,A1) + A2 + W10 + the_const; A4 = ROT32(A4,30); W11 ^= W8; W11 ^= W3; W11 ^= W13; W11 = ROT32(W11,1); A1 = ROT32(A2,5) + f2(A3,A4,A0) + A1 + W11 + the_const; A3 = ROT32(A3,30); W12 ^= W9; W12 ^= W4; W12 ^= W14; W12 = ROT32(W12,1); A0 = ROT32(A1,5) + f2(A2,A3,A4) + A0 + W12 + the_const; A2 = ROT32(A2,30); W13 ^= W10; W13 ^= W5; W13 ^= W15; W13 = ROT32(W13,1); A4 = ROT32(A0,5) + f2(A1,A2,A3) + A4 + W13 + the_const; A1 = ROT32(A1,30); W14 ^= W11; W14 ^= W6; W14 ^= W0; W14 = ROT32(W14,1); A3 = ROT32(A4,5) + f2(A0,A1,A2) + A3 + W14 + the_const; A0 = ROT32(A0,30); W15 ^= W12; W15 ^= W7; W15 ^= W1; W15 = ROT32(W15,1); A2 = ROT32(A3,5) + f2(A4,A0,A1) + A2 + W15 + the_const; A4 = ROT32(A4,30); W0 ^= W13; W0 ^= W8; W0 ^= W2; W0 = ROT32(W0,1); A1 = ROT32(A2,5) + f2(A3,A4,A0) + A1 + W0 + the_const; A3 = ROT32(A3,30); W1 ^= W14; W1 ^= W9; W1 ^= W3; W1 = ROT32(W1,1); A0 = ROT32(A1,5) + f2(A2,A3,A4) + A0 + W1 + the_const; A2 = ROT32(A2,30); W2 ^= W15; W2 ^= W10; W2 ^= W4; W2 = ROT32(W2,1); A4 = ROT32(A0,5) + f2(A1,A2,A3) + A4 + W2 + the_const; A1 = ROT32(A1,30); W3 ^= W0; W3 ^= W11; W3 ^= W5; W3 = ROT32(W3,1); A3 = ROT32(A4,5) + f2(A0,A1,A2) + A3 + W3 + the_const; A0 = ROT32(A0,30); W4 ^= W1; W4 ^= W12; W4 ^= W6; W4 = ROT32(W4,1); A2 = ROT32(A3,5) + f2(A4,A0,A1) + A2 + W4 + the_const; A4 = ROT32(A4,30); W5 ^= W2; W5 ^= W13; W5 ^= W7; W5 = ROT32(W5,1); A1 = ROT32(A2,5) + f2(A3,A4,A0) + A1 + W5 + the_const; A3 = ROT32(A3,30); W6 ^= W3; W6 ^= W14; W6 ^= W8; W6 = ROT32(W6,1); A0 = ROT32(A1,5) + f2(A2,A3,A4) + A0 + W6 + the_const; A2 = ROT32(A2,30); W7 ^= W4; W7 ^= W15; W7 ^= W9; W7 = ROT32(W7,1); A4 = ROT32(A0,5) + f2(A1,A2,A3) + A4 + W7 + the_const; A1 = ROT32(A1,30); W8 ^= W5; W8 ^= W0; W8 ^= W10; W8 = ROT32(W8,1); A3 = ROT32(A4,5) + f2(A0,A1,A2) + A3 + W8 + the_const; A0 = ROT32(A0,30); W9 ^= W6; W9 ^= W1; W9 ^= W11; W9 = ROT32(W9,1); A2 = ROT32(A3,5) + f2(A4,A0,A1) + A2 + W9 + the_const; A4 = ROT32(A4,30); W10 ^= W7; W10 ^= W2; W10 ^= W12; W10 = ROT32(W10,1); A1 = ROT32(A2,5) + f2(A3,A4,A0) + A1 + W10 + the_const; A3 = ROT32(A3,30); W11 ^= W8; W11 ^= W3; W11 ^= W13; W11 = ROT32(W11,1); A0 = ROT32(A1,5) + f2(A2,A3,A4) + A0 + W11 + the_const; A2 = ROT32(A2,30); the_const = CONST3; W12 ^= W9; W12 ^= W4; W12 ^= W14; W12 = ROT32(W12,1); A4 = ROT32(A0,5) + f3(A1,A2,A3) + A4 + W12 + the_const; A1 = ROT32(A1,30); W13 ^= W10; W13 ^= W5; W13 ^= W15; W13 = ROT32(W13,1); A3 = ROT32(A4,5) + f3(A0,A1,A2) + A3 + W13 + the_const; A0 = ROT32(A0,30); W14 ^= W11; W14 ^= W6; W14 ^= W0; W14 = ROT32(W14,1); A2 = ROT32(A3,5) + f3(A4,A0,A1) + A2 + W14 + the_const; A4 = ROT32(A4,30); W15 ^= W12; W15 ^= W7; W15 ^= W1; W15 = ROT32(W15,1); A1 = ROT32(A2,5) + f3(A3,A4,A0) + A1 + W15 + the_const; A3 = ROT32(A3,30); W0 ^= W13; W0 ^= W8; W0 ^= W2; W0 = ROT32(W0,1); A0 = ROT32(A1,5) + f3(A2,A3,A4) + A0 + W0 + the_const; A2 = ROT32(A2,30); W1 ^= W14; W1 ^= W9; W1 ^= W3; W1 = ROT32(W1,1); A4 = ROT32(A0,5) + f3(A1,A2,A3) + A4 + W1 + the_const; A1 = ROT32(A1,30); W2 ^= W15; W2 ^= W10; W2 ^= W4; W2 = ROT32(W2,1); A3 = ROT32(A4,5) + f3(A0,A1,A2) + A3 + W2 + the_const; A0 = ROT32(A0,30); W3 ^= W0; W3 ^= W11; W3 ^= W5; W3 = ROT32(W3,1); A2 = ROT32(A3,5) + f3(A4,A0,A1) + A2 + W3 + the_const; A4 = ROT32(A4,30); W4 ^= W1; W4 ^= W12; W4 ^= W6; W4 = ROT32(W4,1); A1 = ROT32(A2,5) + f3(A3,A4,A0) + A1 + W4 + the_const; A3 = ROT32(A3,30); W5 ^= W2; W5 ^= W13; W5 ^= W7; W5 = ROT32(W5,1); A0 = ROT32(A1,5) + f3(A2,A3,A4) + A0 + W5 + the_const; A2 = ROT32(A2,30); W6 ^= W3; W6 ^= W14; W6 ^= W8; W6 = ROT32(W6,1); A4 = ROT32(A0,5) + f3(A1,A2,A3) + A4 + W6 + the_const; A1 = ROT32(A1,30); W7 ^= W4; W7 ^= W15; W7 ^= W9; W7 = ROT32(W7,1); A3 = ROT32(A4,5) + f3(A0,A1,A2) + A3 + W7 + the_const; A0 = ROT32(A0,30); W8 ^= W5; W8 ^= W0; W8 ^= W10; W8 = ROT32(W8,1); A2 = ROT32(A3,5) + f3(A4,A0,A1) + A2 + W8 + the_const; A4 = ROT32(A4,30); W9 ^= W6; W9 ^= W1; W9 ^= W11; W9 = ROT32(W9,1); A1 = ROT32(A2,5) + f3(A3,A4,A0) + A1 + W9 + the_const; A3 = ROT32(A3,30); W10 ^= W7; W10 ^= W2; W10 ^= W12; W10 = ROT32(W10,1); A0 = ROT32(A1,5) + f3(A2,A3,A4) + A0 + W10 + the_const; A2 = ROT32(A2,30); W11 ^= W8; W11 ^= W3; W11 ^= W13; W11 = ROT32(W11,1); A4 = ROT32(A0,5) + f3(A1,A2,A3) + A4 + W11 + the_const; A1 = ROT32(A1,30); W12 ^= W9; W12 ^= W4; W12 ^= W14; W12 = ROT32(W12,1); A3 = ROT32(A4,5) + f3(A0,A1,A2) + A3 + W12 + the_const; A0 = ROT32(A0,30); W13 ^= W10; W13 ^= W5; W13 ^= W15; W13 = ROT32(W13,1); A2 = ROT32(A3,5) + f3(A4,A0,A1) + A2 + W13 + the_const; A4 = ROT32(A4,30); W14 ^= W11; W14 ^= W6; W14 ^= W0; W14 = ROT32(W14,1); A1 = ROT32(A2,5) + f3(A3,A4,A0) + A1 + W14 + the_const; A3 = ROT32(A3,30); W15 ^= W12; W15 ^= W7; W15 ^= W1; W15 = ROT32(W15,1); A0 = ROT32(A1,5) + f3(A2,A3,A4) + A0 + W15 + the_const; A2 = ROT32(A2,30); Aout += A0; Bout += A1; Cout += A2; Dout += A3; Eout += A4; } if ((Aout ^ Bout ^ Cout ^ Dout ^ Eout) == RESULT) return 0xbadbeef; else return 0; /* printf("%x %x\n", (Aout ^ Bout ^ Cout ^ Dout ^ Eout), RESULT); */ }