File:  [ELWIX - Embedded LightWeight unIX -] / libaitcrc / src / hash.c
Revision 1.1.2.1: download - view: text, annotated - select for diffs - revision graph
Sun Jun 13 16:29:03 2010 UTC (14 years, 3 months ago) by misho
Branches: crc2_0
added new function from libaithash, merge libs

/*************************************************************************
* (C) 2009 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
*  by Michael Pounov <misho@openbsd-bg.org>
*
* $Author: misho $
* $Id: hash.c,v 1.1.2.1 2010/06/13 16:29:03 misho Exp $
*
*************************************************************************/
#include "global.h"


/*
 * hash_varchar() Compute index hash by variable length string
 * @csStr = Input data buffer
 * @nStrLen = Length of data buffer
 * @nVer = Version of algorythm; 0 - original, 1 - AITNET variant
 * return: Hash value
*/
inline u_int
hash_varchar(const char *csStr, int nStrLen, int nVer)
{
	register u_int n, hash = 0;
	register int i;

	assert(csStr);

	for (i = 0; i < nStrLen; i++) {
		n = 2 * hash + csStr[i];
		if (!nVer) {
			if (hash & 0x80000000)
				n ^= 0xC0A0A0D5;		// Polynom CRC-32 aviation
		} else {
			if (n & 1)				// Misho ;) patch for better avalanche!!!
				n ^= 0xC0A0A0D5;		// Polynom CRC-32 aviation
		}
		hash = n;
	}

	return hash;
}

/*
 * hash_bernstein() Compute index hash by Bernstein
 * @csStr = Input data buffer
 * @nStrLen = Length of data buffer
 * @nVer = Version of algorythm; 0 - Bernstein, 1 - DJBX33A variant
 * return: Hash value
*/
inline u_int
hash_bernstein(const char *csStr, int nStrLen, int nVer)
{
	register u_int hash = 5381;
	register int i;

	assert(csStr);

	for (i = 0; i < nStrLen; i++)
		if (!nVer)
			hash = ((hash << 5) + hash) + csStr[i];
		else
			hash = hash * 33 + csStr[i];		// DJBX33A

	return hash;
}

/*
 * hash_fnv1() Compute index hash by FNV-1
 * @csStr = Input data buffer
 * @nStrLen = Length of data buffer
 * @nVer = Version of algorythm; 0 - FNV-1, 1 - FNV-1a (best avalanche)
 * return: Hash value
*/
inline u_int
hash_fnv1(const char *csStr, int nStrLen, int nVer)
{
	register u_int hash = 0x811c9dc5;			// 2166136261
	register int i;

	assert(csStr);

	for (i = 0; i < nStrLen; i++)
		if (!nVer) {					// FNV-1
			hash *= 16777619;
			hash ^= csStr[i];
		} else {					// FNV-1a
			hash ^= csStr[i];
			hash *= 16777619;
		}

	return hash;
}

/*
 * hash_jenkins() Compute index hash by Jenkins (one-at-a-time)
 * @csStr = Input data buffer
 * @nStrLen = Length of data buffer
 * return: Hash value
*/
inline u_int
hash_jenkins(const char *csStr, int nStrLen)
{
	register u_int hash = 0;
	register int i;

	assert(csStr);

	for (i = 0; i < nStrLen; i++) {
		hash += csStr[i];
		hash += (hash << 10);
		hash ^= (hash >> 6);
	}
	hash += (hash << 3);
	hash ^= (hash >> 11);
	hash += (hash << 15);

	return hash;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>