Annotation of libaitcrc/src/hash.c, revision 1.1.2.1

1.1.2.1 ! misho       1: /*************************************************************************
        !             2: * (C) 2009 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: libaithash.c,v 1.2 2009/10/01 09:26:33 misho Exp $
        !             7: *
        !             8: *************************************************************************/
        !             9: #include "global.h"
        !            10: 
        !            11: 
        !            12: /*
        !            13:  * hash_varchar() Compute index hash by variable length string
        !            14:  * @csStr = Input data buffer
        !            15:  * @nStrLen = Length of data buffer
        !            16:  * @nVer = Version of algorythm; 0 - original, 1 - AITNET variant
        !            17:  * return: Hash value
        !            18: */
        !            19: inline u_int
        !            20: hash_varchar(const char *csStr, int nStrLen, int nVer)
        !            21: {
        !            22:        register u_int n, hash = 0;
        !            23:        register int i;
        !            24: 
        !            25:        assert(csStr);
        !            26: 
        !            27:        for (i = 0; i < nStrLen; i++) {
        !            28:                n = 2 * hash + csStr[i];
        !            29:                if (!nVer) {
        !            30:                        if (hash & 0x80000000)
        !            31:                                n ^= 0xC0A0A0D5;                // Polynom CRC-32 aviation
        !            32:                } else {
        !            33:                        if (n & 1)                              // Misho ;) patch for better avalanche!!!
        !            34:                                n ^= 0xC0A0A0D5;                // Polynom CRC-32 aviation
        !            35:                }
        !            36:                hash = n;
        !            37:        }
        !            38: 
        !            39:        return hash;
        !            40: }
        !            41: 
        !            42: /*
        !            43:  * hash_bernstein() Compute index hash by Bernstein
        !            44:  * @csStr = Input data buffer
        !            45:  * @nStrLen = Length of data buffer
        !            46:  * @nVer = Version of algorythm; 0 - Bernstein, 1 - DJBX33A variant
        !            47:  * return: Hash value
        !            48: */
        !            49: inline u_int
        !            50: hash_bernstein(const char *csStr, int nStrLen, int nVer)
        !            51: {
        !            52:        register u_int hash = 5381;
        !            53:        register int i;
        !            54: 
        !            55:        assert(csStr);
        !            56: 
        !            57:        for (i = 0; i < nStrLen; i++)
        !            58:                if (!nVer)
        !            59:                        hash = ((hash << 5) + hash) + csStr[i];
        !            60:                else
        !            61:                        hash = hash * 33 + csStr[i];            // DJBX33A
        !            62: 
        !            63:        return hash;
        !            64: }
        !            65: 
        !            66: /*
        !            67:  * hash_fnv1() Compute index hash by FNV-1
        !            68:  * @csStr = Input data buffer
        !            69:  * @nStrLen = Length of data buffer
        !            70:  * @nVer = Version of algorythm; 0 - FNV-1, 1 - FNV-1a (best avalanche)
        !            71:  * return: Hash value
        !            72: */
        !            73: inline u_int
        !            74: hash_fnv1(const char *csStr, int nStrLen, int nVer)
        !            75: {
        !            76:        register u_int hash = 0x811c9dc5;                       // 2166136261
        !            77:        register int i;
        !            78: 
        !            79:        assert(csStr);
        !            80: 
        !            81:        for (i = 0; i < nStrLen; i++)
        !            82:                if (!nVer) {                                    // FNV-1
        !            83:                        hash *= 16777619;
        !            84:                        hash ^= csStr[i];
        !            85:                } else {                                        // FNV-1a
        !            86:                        hash ^= csStr[i];
        !            87:                        hash *= 16777619;
        !            88:                }
        !            89: 
        !            90:        return hash;
        !            91: }
        !            92: 
        !            93: /*
        !            94:  * hash_jenkins() Compute index hash by Jenkins (one-at-a-time)
        !            95:  * @csStr = Input data buffer
        !            96:  * @nStrLen = Length of data buffer
        !            97:  * return: Hash value
        !            98: */
        !            99: inline u_int
        !           100: hash_jenkins(const char *csStr, int nStrLen)
        !           101: {
        !           102:        register u_int hash = 0;
        !           103:        register int i;
        !           104: 
        !           105:        assert(csStr);
        !           106: 
        !           107:        for (i = 0; i < nStrLen; i++) {
        !           108:                hash += csStr[i];
        !           109:                hash += (hash << 10);
        !           110:                hash ^= (hash >> 6);
        !           111:        }
        !           112:        hash += (hash << 3);
        !           113:        hash ^= (hash >> 11);
        !           114:        hash += (hash << 15);
        !           115: 
        !           116:        return hash;
        !           117: }

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