/*************************************************************************
* (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>