Logo Search packages:      
Sourcecode: pan version File versions  Download package

size_t pan::Quark::StringViewHash::operator() ( const Impl s ) const [inline]

Paul Hsieh's "SuperFastHash" algorithm, from http://www.azillionmonkeys.com/qed/hash.html

Definition at line 94 of file quark.h.

        {
          const char * data (s.str);
          int len (s.len);

          uint32_t tmp, hash=len;
          if (len <= 0 || data == NULL) return 0;

          int rem = len & 3;
          len >>= 2;

          /* Main loop */
          for (;len > 0; len--) {
              hash  += get16bits (data);
              tmp    = (get16bits (data+2) << 11) ^ hash;
              hash   = (hash << 16) ^ tmp;
              data  += 2*sizeof (uint16_t);
              hash  += hash >> 11;
          }

          /* Handle end cases */
          switch (rem) {
              case 3: hash += get16bits (data);
                      hash ^= hash << 16;
                      hash ^= data[sizeof (uint16_t)] << 18;
                      hash += hash >> 11;
                      break;
              case 2: hash += get16bits (data);
                      hash ^= hash << 11;
                      hash += hash >> 17;
                      break;
              case 1: hash += *data;
                      hash ^= hash << 10;
                      hash += hash >> 1;
          }

          /* Force "avalanching" of final 127 bits */
          hash ^= hash << 3;
          hash += hash >> 5;
          hash ^= hash << 4;
          hash += hash >> 17;
          hash ^= hash << 25;
          hash += hash >> 6;

          return hash;
        }

Generated by  Doxygen 1.6.0   Back to index