#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
#define g16b(d) (*((const UINT16 *) (d)))
#endif
#if !defined (g16b)
#define g16b(d) ((((UINT32)(((const BYTE *)(d))[1])) << 8) + (UINT32)(((const BYTE *)(d))[0]) )
#endif
UINT32 fast_hash(char * data, INT32 len, INT32 maxhash)
{
UINT32 hash = len;
UINT32 tmp;
INT32 rem;
if (len <= 0 || data == NULL) return 0;
rem = len & 3;
len >>= 2;
/* Main loop */
for (;len > 0; len--)
{
hash += g16b(data);
tmp = (g16b(data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2 * sizeof(INT16);
hash += hash >> 11;
}
/* Handle end cases */
switch (rem) {
case 3: hash += g16b (data);
hash ^= hash << 16;
hash ^= ((signed char)data[sizeof (uint16_t)]) << 18;
hash += hash >> 11;
break;
case 2: hash += g16b(data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += (signed char)*data;
hash ^= hash << 10;
hash += hash >> 1;
}
/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return (maxhash) ? hash % maxhash : hash;
}
Ma si vedrà lontano un miglio che non è farina del tuo sacco....