Logo Search packages:      
Sourcecode: blender version File versions

qdtl.cpp

#include "qdtl.h"

__BEGIN_QDRENDER

//------------------------------------------------------------------------------
// the actual hash function
// by Paul Hsieh, see http://www.azillionmonkeys.com/qed/hash.html

#define get16bits(d) (*((const unsigned short *)(d)))
unsigned int hashfunc(const unsigned char* data, unsigned int len)
{
      unsigned int hash = len;

      if (len == 0 || data == NULL) return 0;

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

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

      // Handle end cases
      switch (rem) {
            case 3: hash += get16bits (data);
                    hash ^= hash << 16;
                    hash ^= data[sizeof (unsigned short)] << 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;
}
#undef get16bits

__END_QDRENDER

Generated by  Doxygen 1.6.0   Back to index