/* 
 * Hash lookup function.
 * Copyright (C) 2003, 2004 Mondru AB.
 * 
 * The contents of this file may be used under the terms of the GNU
 * General Public License Version 2, provided that the above copyright
 * notice and this permission notice is included in all copies or
 * substantial portions of the software.
 * 
 */

/**
 * lookup()
 * Generates a 32 bit hash.
 * Based on public domain code by Bob Jenkins
 * It should be one of the best hash functions around in terms of both
 * statistical properties and speed. It is NOT recommended for cryptographic
 * purposes.
 **/
unsigned long int lookup(k, length, level)
register unsigned char *k;	/* the key */
register unsigned long int length;	/* the length of the key */
register unsigned long int level;	/* the previous hash, or an arbitrary value */
{

#define mix(a,b,c) \
{ \
  a -= b; a -= c; a ^= (c>>13); \
  b -= c; b -= a; b ^= (a<<8); \
  c -= a; c -= b; c ^= (b>>13); \
  a -= b; a -= c; a ^= (c>>12);  \
  b -= c; b -= a; b ^= (a<<16); \
  c -= a; c -= b; c ^= (b>>5); \
  a -= b; a -= c; a ^= (c>>3);  \
  b -= c; b -= a; b ^= (a<<10); \
  c -= a; c -= b; c ^= (b>>15); \
}

	typedef unsigned long int ub4;	/* unsigned 4-byte quantities */
	typedef unsigned char ub1;	/* unsigned 1-byte quantities */
	register unsigned long int a, b, c, len;

	/* Set up the internal state */
	len = length;
	a = b = 0x9e3779b9;	/* the golden ratio; an arbitrary value */
	c = level;		/* the previous hash value */

  /*---------------------------------------- handle most of the key */
	while (len >= 12) {
		a += (k[0] + ((ub4) k[1] << 8) + ((ub4) k[2] << 16) +
		      ((ub4) k[3] << 24));
		b += (k[4] + ((ub4) k[5] << 8) + ((ub4) k[6] << 16) +
		      ((ub4) k[7] << 24));
		c += (k[8] + ((ub4) k[9] << 8) + ((ub4) k[10] << 16) +
		      ((ub4) k[11] << 24));
		mix(a, b, c);
		k += 12;
		len -= 12;
	}

  /*------------------------------------- handle the last 11 bytes */
	c += length;
	switch (len) {		/* all the case statements fall through */
	case 11:
		c += ((ub4) k[10] << 24);
	case 10:
		c += ((ub4) k[9] << 16);
	case 9:
		c += ((ub4) k[8] << 8);
		/* the first byte of c is reserved for the length */
	case 8:
		b += ((ub4) k[7] << 24);
	case 7:
		b += ((ub4) k[6] << 16);
	case 6:
		b += ((ub4) k[5] << 8);
	case 5:
		b += k[4];
	case 4:
		a += ((ub4) k[3] << 24);
	case 3:
		a += ((ub4) k[2] << 16);
	case 2:
		a += ((ub4) k[1] << 8);
	case 1:
		a += k[0];
		/* case 0: nothing left to add */
	}
	mix(a, b, c);
  /*-------------------------------------------- report the result */
	return c;
}
