#include <sys/types.h> short hash(char *start, int len) { int *p; int o; int a,b,c,d,x,m; auto i; #if 0 &i; #endif p = (int *)((size_t)start+3 & ~3); o = len >> 3; m = (unsigned)-1 << (((size_t)start & 3) << 3); m = ~m; #define X 1 #if 1 b = p[1]; c = p[2]; d = p[3]; #if X x = p[0]; x ^= p[4]; x &= m; x ^= p[4]; a = x; #else a ^= ((p[0] ^ p[4]) & m) ^ p[4]; #endif #else a = b = c = d = 0; #endif p = (int *)((char*)p + o) + 4; i = 7; do { b ^= p[-3]; c ^= p[-2]; d ^= p[-1]; #if X x = p[-4]; x ^= p[0]; x &= m; x ^= p[0]; a ^= x; #else a ^= ((p[-4] ^ p[0]) & m) ^ p[1]; #endif a++,b++,c++,d++; p = (int *)((char*)p + o); } while (--i); return a + b + c + d; }