hash.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * Copyright 2010-2019 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #ifndef BX_HASH_H_HEADER_GUARD
  6. #define BX_HASH_H_HEADER_GUARD
  7. #include "allocator.h" // isAligned
  8. #include "string.h" // StringView
  9. namespace bx
  10. {
  11. /// MurmurHash2 was written by Austin Appleby, and is placed in the public
  12. /// domain. The author hereby disclaims copyright to this source code.
  13. ///
  14. class HashMurmur2A
  15. {
  16. public:
  17. ///
  18. void begin(uint32_t _seed = 0);
  19. ///
  20. void add(const void* _data, int _len);
  21. ///
  22. template<typename Ty>
  23. void add(Ty _value);
  24. ///
  25. uint32_t end();
  26. private:
  27. ///
  28. void addAligned(const void* _data, int _len);
  29. ///
  30. void addUnaligned(const void* _data, int _len);
  31. ///
  32. static void readUnaligned(const void* _data, uint32_t& _out);
  33. ///
  34. void mixTail(const uint8_t*& _data, int& _len);
  35. uint32_t m_hash;
  36. uint32_t m_tail;
  37. uint32_t m_count;
  38. uint32_t m_size;
  39. };
  40. ///
  41. class HashAdler32
  42. {
  43. public:
  44. ///
  45. void begin();
  46. ///
  47. void add(const void* _data, int _len);
  48. ///
  49. template<typename Ty>
  50. void add(Ty _value);
  51. ///
  52. uint32_t end();
  53. private:
  54. uint32_t m_a;
  55. uint32_t m_b;
  56. };
  57. ///
  58. class HashCrc32
  59. {
  60. public:
  61. enum Enum
  62. {
  63. Ieee, //!< 0xedb88320
  64. Castagnoli, //!< 0x82f63b78
  65. Koopman, //!< 0xeb31d82e
  66. Count
  67. };
  68. ///
  69. void begin(Enum _type = Ieee);
  70. ///
  71. void add(const void* _data, int _len);
  72. ///
  73. template<typename Ty>
  74. void add(Ty _value);
  75. ///
  76. uint32_t end();
  77. private:
  78. const uint32_t* m_table;
  79. uint32_t m_hash;
  80. };
  81. ///
  82. template<typename HashT>
  83. uint32_t hash(const void* _data, uint32_t _size);
  84. ///
  85. template<typename HashT, typename Ty>
  86. uint32_t hash(const Ty& _data);
  87. ///
  88. template<typename HashT>
  89. uint32_t hash(const StringView& _data);
  90. ///
  91. template<typename HashT>
  92. uint32_t hash(const char* _data);
  93. } // namespace bx
  94. #include "inline/hash.inl"
  95. #endif // BX_HASH_H_HEADER_GUARD