Hash.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #ifndef AI_HASH_H_INCLUDED
  2. #define AI_HASH_H_INCLUDED
  3. // ------------------------------------------------------------------------------------------------
  4. // hashing function taken from
  5. // http://www.azillionmonkeys.com/qed/hash.html
  6. // (incremental version of the hashing function)
  7. // (stdint.h should have been been included here)
  8. #undef get16bits
  9. #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
  10. || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
  11. #define get16bits(d) (*((const uint16_t *) (d)))
  12. #endif
  13. #if !defined (get16bits)
  14. #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
  15. +(uint32_t)(((const uint8_t *)(d))[0]) )
  16. #endif
  17. // ------------------------------------------------------------------------------------------------
  18. inline uint32_t SuperFastHash (const char * data, int len, uint32_t hash = 0) {
  19. uint32_t tmp;
  20. int rem;
  21. if (len <= 0 || data == NULL) return 0;
  22. rem = len & 3;
  23. len >>= 2;
  24. /* Main loop */
  25. for (;len > 0; len--) {
  26. hash += get16bits (data);
  27. tmp = (get16bits (data+2) << 11) ^ hash;
  28. hash = (hash << 16) ^ tmp;
  29. data += 2*sizeof (uint16_t);
  30. hash += hash >> 11;
  31. }
  32. /* Handle end cases */
  33. switch (rem) {
  34. case 3: hash += get16bits (data);
  35. hash ^= hash << 16;
  36. hash ^= data[sizeof (uint16_t)] << 18;
  37. hash += hash >> 11;
  38. break;
  39. case 2: hash += get16bits (data);
  40. hash ^= hash << 11;
  41. hash += hash >> 17;
  42. break;
  43. case 1: hash += *data;
  44. hash ^= hash << 10;
  45. hash += hash >> 1;
  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. return hash;
  55. }
  56. #endif // !! AI_HASH_H_INCLUDED