--- libaitcrc/src/hash.c 2010/06/13 16:29:03 1.1 +++ libaitcrc/src/hash.c 2010/06/13 16:29:03 1.1.2.1 @@ -0,0 +1,117 @@ +/************************************************************************* +* (C) 2009 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov +* +* $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; +}