--- libaitcrc/src/hash.c 2010/06/13 16:29:03 1.1 +++ libaitcrc/src/hash.c 2011/04/28 20:28:20 1.2 @@ -0,0 +1,179 @@ +/************************************************************************* +* (C) 2009 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov +* +* $Author: misho $ +* $Id: hash.c,v 1.2 2011/04/28 20:28:20 misho Exp $ +* +************************************************************************** +The ELWIX and AITNET software is distributed under the following +terms: + +All of the documentation and software included in the ELWIX and AITNET +Releases is copyrighted by ELWIX - Sofia/Bulgaria + +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + by Michael Pounov . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: +This product includes software developed by Michael Pounov +ELWIX - Embedded LightWeight unIX and its contributors. +4. Neither the name of AITNET nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ +#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; +}