hash.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef _CRUSH_HASH_H
  2. #define _CRUSH_HASH_H
  3. /*
  4. * Robert Jenkins' function for mixing 32-bit values
  5. * http://burtleburtle.net/bob/hash/evahash.html
  6. * a, b = random bits, c = input and output
  7. */
  8. #define crush_hashmix(a, b, c) do { \
  9. a = a-b; a = a-c; a = a^(c>>13); \
  10. b = b-c; b = b-a; b = b^(a<<8); \
  11. c = c-a; c = c-b; c = c^(b>>13); \
  12. a = a-b; a = a-c; a = a^(c>>12); \
  13. b = b-c; b = b-a; b = b^(a<<16); \
  14. c = c-a; c = c-b; c = c^(b>>5); \
  15. a = a-b; a = a-c; a = a^(c>>3); \
  16. b = b-c; b = b-a; b = b^(a<<10); \
  17. c = c-a; c = c-b; c = c^(b>>15); \
  18. } while (0)
  19. #define crush_hash_seed 1315423911
  20. static inline __u32 crush_hash32(__u32 a)
  21. {
  22. __u32 hash = crush_hash_seed ^ a;
  23. __u32 b = a;
  24. __u32 x = 231232;
  25. __u32 y = 1232;
  26. crush_hashmix(b, x, hash);
  27. crush_hashmix(y, a, hash);
  28. return hash;
  29. }
  30. static inline __u32 crush_hash32_2(__u32 a, __u32 b)
  31. {
  32. __u32 hash = crush_hash_seed ^ a ^ b;
  33. __u32 x = 231232;
  34. __u32 y = 1232;
  35. crush_hashmix(a, b, hash);
  36. crush_hashmix(x, a, hash);
  37. crush_hashmix(b, y, hash);
  38. return hash;
  39. }
  40. static inline __u32 crush_hash32_3(__u32 a, __u32 b, __u32 c)
  41. {
  42. __u32 hash = crush_hash_seed ^ a ^ b ^ c;
  43. __u32 x = 231232;
  44. __u32 y = 1232;
  45. crush_hashmix(a, b, hash);
  46. crush_hashmix(c, x, hash);
  47. crush_hashmix(y, a, hash);
  48. crush_hashmix(b, x, hash);
  49. crush_hashmix(y, c, hash);
  50. return hash;
  51. }
  52. static inline __u32 crush_hash32_4(__u32 a, __u32 b, __u32 c,
  53. __u32 d)
  54. {
  55. __u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d;
  56. __u32 x = 231232;
  57. __u32 y = 1232;
  58. crush_hashmix(a, b, hash);
  59. crush_hashmix(c, d, hash);
  60. crush_hashmix(a, x, hash);
  61. crush_hashmix(y, b, hash);
  62. crush_hashmix(c, x, hash);
  63. crush_hashmix(y, d, hash);
  64. return hash;
  65. }
  66. static inline __u32 crush_hash32_5(__u32 a, __u32 b, __u32 c,
  67. __u32 d, __u32 e)
  68. {
  69. __u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d ^ e;
  70. __u32 x = 231232;
  71. __u32 y = 1232;
  72. crush_hashmix(a, b, hash);
  73. crush_hashmix(c, d, hash);
  74. crush_hashmix(e, x, hash);
  75. crush_hashmix(y, a, hash);
  76. crush_hashmix(b, x, hash);
  77. crush_hashmix(y, c, hash);
  78. crush_hashmix(d, x, hash);
  79. crush_hashmix(y, e, hash);
  80. return hash;
  81. }
  82. #endif