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