File:  [ELWIX - Embedded LightWeight unIX -] / libaitcrc / src / hash.c
Revision 1.1.2.2: download - view: text, annotated - select for diffs - revision graph
Tue Sep 28 08:40:53 2010 UTC (14 years ago) by misho
Branches: crc2_0
added new hash method Red Dragon

/*************************************************************************
* (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.2 2010/09/28 08:40:53 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;
}

/*
 * hash_reddragon() Compute index hash by Red Dragon
 * @csStr = Input data buffer
 * @nStrLen = Length of data buffer
 * return: Hash value
*/
inline u_int
hash_reddragon(const char *csStr, int nStrLen)
{
	register u_int g, hash;
	register int i;

	assert(csStr);

	for (hash = 0, i = 0; i < nStrLen; i++) {
		hash = (hash << 4) + csStr[i];
		if ((g = hash & 0xF0000000)) {
			hash ^= g >> 24;
			hash ^= g;
		}
	}

	return hash;
}

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