分享一个新的对字符串的哈希算法之FastHash

来源:互联网 发布:制作蹭饭地图软件 编辑:程序博客网 时间:2024/05/16 13:04
算法如下:

#if OGRE_ENDIAN == OGRE_ENDIAN_LITTLE 大端小端 自己定义一下
#  define OGRE_GET16BITS(d) (*((const uint16 *) (d)))
#else
#  define OGRE_GET16BITS(d) (*((const uint8 *) (d)) + (*((const uint8 *) (d+1))<<8))
#endif
 
//说明:一般情况下,hashSoFar 设置为0.
uint32  FastHash (const char * data, int len, uint32 hashSoFar)
{
 uint32 hash;
 uint32 tmp;
 int rem;
 
 if (hashSoFar)
  hash = hashSoFar;
 else
  hash = len;
 
 if (len <= 0 || data == NULL) return 0;
 
 rem = len & 3;
 len >>= 2;
 
 /* Main loop */
 for (;len > 0; len--) {
  hash  += OGRE_GET16BITS (data);
  tmp    = (OGRE_GET16BITS (data+2) << 11) ^ hash;
  hash   = (hash << 16) ^ tmp;
  data  += 2*sizeof (uint16);
  hash  += hash >> 11;
 }
 
 /* Handle end cases */
 switch (rem) {
 case 3: hash += OGRE_GET16BITS (data);
  hash ^= hash << 16;
  hash ^= data[sizeof (uint16)] << 18;
  hash += hash >> 11;
  break;
 case 2: hash += OGRE_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;
}
0 0