Annotation of embedaddon/coova-chilli/src/sfhash.c, revision 1.1.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>