Annotation of embedaddon/coova-chilli/src/sfhash.c, revision 1.1

1.1     ! misho       1: #include "system.h"
        !             2: #undef get16bits
        !             3: #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
        !             4:   || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
        !             5: #define get16bits(d) (*((const uint16_t *) (d)))
        !             6: #endif
        !             7: 
        !             8: #if !defined (get16bits)
        !             9: #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
        !            10:                        +(uint32_t)(((const uint8_t *)(d))[0]) )
        !            11: #endif
        !            12: 
        !            13: uint32_t SuperFastHash (const char * data, int len, uint32_t hash) {
        !            14: uint32_t tmp;
        !            15: int rem;
        !            16: 
        !            17:     if (len <= 0 || data == NULL) return 0;
        !            18: 
        !            19:     rem = len & 3;
        !            20:     len >>= 2;
        !            21: 
        !            22:     /* Main loop */
        !            23:     for (;len > 0; len--) {
        !            24:         hash  += get16bits (data);
        !            25:         tmp    = (get16bits (data+2) << 11) ^ hash;
        !            26:         hash   = (hash << 16) ^ tmp;
        !            27:         data  += 2*sizeof (uint16_t);
        !            28:         hash  += hash >> 11;
        !            29:     }
        !            30: 
        !            31:     /* Handle end cases */
        !            32:     switch (rem) {
        !            33:         case 3: hash += get16bits (data);
        !            34:                 hash ^= hash << 16;
        !            35:                 hash ^= data[sizeof (uint16_t)] << 18;
        !            36:                 hash += hash >> 11;
        !            37:                 break;
        !            38:         case 2: hash += get16bits (data);
        !            39:                 hash ^= hash << 11;
        !            40:                 hash += hash >> 17;
        !            41:                 break;
        !            42:         case 1: hash += *data;
        !            43:                 hash ^= hash << 10;
        !            44:                 hash += hash >> 1;
        !            45:     }
        !            46: 
        !            47:     /* Force "avalanching" of final 127 bits */
        !            48:     hash ^= hash << 3;
        !            49:     hash += hash >> 5;
        !            50:     hash ^= hash << 4;
        !            51:     hash += hash >> 17;
        !            52:     hash ^= hash << 25;
        !            53:     hash += hash >> 6;
        !            54: 
        !            55:     return hash;
        !            56: }

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