hash.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright 2010-2023 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx/blob/master/LICENSE
  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. /// 32-bit Adler checksum hash.
  12. class HashAdler32
  13. {
  14. public:
  15. ///
  16. void begin();
  17. ///
  18. void add(const void* _data, int32_t _len);
  19. ///
  20. void add(const char* _data);
  21. ///
  22. void add(const StringView& _data);
  23. ///
  24. template<typename Ty>
  25. void add(const Ty& _data);
  26. ///
  27. uint32_t end();
  28. private:
  29. uint32_t m_a;
  30. uint32_t m_b;
  31. };
  32. /// 32-bit cyclic redundancy checksum hash.
  33. class HashCrc32
  34. {
  35. public:
  36. enum Enum
  37. {
  38. Ieee, //!< 0xedb88320
  39. Castagnoli, //!< 0x82f63b78
  40. Koopman, //!< 0xeb31d82e
  41. Count
  42. };
  43. ///
  44. void begin(Enum _type = Ieee);
  45. ///
  46. void add(const void* _data, int32_t _len);
  47. ///
  48. void add(const char* _data);
  49. ///
  50. void add(const StringView& _data);
  51. ///
  52. template<typename Ty>
  53. void add(const Ty& _data);
  54. ///
  55. uint32_t end();
  56. private:
  57. const uint32_t* m_table;
  58. uint32_t m_hash;
  59. };
  60. /// 32-bit multiply and rotate hash.
  61. class HashMurmur2A
  62. {
  63. public:
  64. ///
  65. void begin(uint32_t _seed = 0);
  66. ///
  67. void add(const void* _data, int32_t _len);
  68. ///
  69. void add(const char* _data);
  70. ///
  71. void add(const StringView& _data);
  72. ///
  73. template<typename Ty>
  74. void add(const Ty& _data);
  75. ///
  76. uint32_t end();
  77. private:
  78. uint32_t m_hash;
  79. uint32_t m_tail;
  80. uint32_t m_count;
  81. uint32_t m_size;
  82. };
  83. ///
  84. template<typename HashT>
  85. uint32_t hash(const void* _data, uint32_t _size);
  86. ///
  87. template<typename HashT>
  88. uint32_t hash(const char* _data);
  89. ///
  90. template<typename HashT>
  91. uint32_t hash(const StringView& _data);
  92. ///
  93. template<typename HashT, typename Ty>
  94. uint32_t hash(const Ty& _data);
  95. } // namespace bx
  96. #include "inline/hash.inl"
  97. #endif // BX_HASH_H_HEADER_GUARD