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