/*
  This File is copied from
  
  http://www.oreilly.com/catalog/masteralgoc/index.html
  Mastering Algorithms with C
  By Kyle Loudon
  ISBN: 1-56592-453-3
  Publishd by O'Reilly

  We have added our own struct to these function.
 */

/*****************************************************************************
*                                                                            *
*  ------------------------------- hashpjw.c ------------------------------  *
*                                                                            *
*****************************************************************************/

#include <common/config.h>
#include <common/hashpjw.h>
#include <common/appsession.h>

/*****************************************************************************
*                                                                            *
*  -------------------------------- hashpjw -------------------------------  *
*                                                                            *
*****************************************************************************/

int hashpjw(const void *key) {

	const char         *ptr;
	unsigned int        val;
	appsess *appsession_temp;

	/*********************************************************************
	 *                                                                    *
	 *  Hash the key by performing a number of bit operations on it.      *
	 *                                                                    *
	 *********************************************************************/

	val = 0;
	appsession_temp = (appsess *)key;
	ptr = appsession_temp->sessid;

	while (*ptr != '\0') {

		int tmp;

		val = (val << 4) + (*ptr);

		if((tmp = (val & 0xf0000000))) {
			val = val ^ (tmp >> 24);
			val = val ^ tmp;
		}
		ptr++;
	}/* end while */

	/*********************************************************************
	 *                                                                    *
	 *  In practice, replace PRIME_TBLSIZ with the actual table size.     *
	 *                                                                    *
	 *********************************************************************/
	return val % PRIME_TBLSIZ;
}/* end hashpjw */

/*
 * Local variables:
 *  c-indent-level: 8
 *  c-basic-offset: 8
 * End:
 */
