Embedded Template Library  1.0
 All Classes Files Functions Variables Typedefs Friends Modules Pages
fnv_1.h
Go to the documentation of this file.
1 
3 /******************************************************************************
4 The MIT License(MIT)
5 
6 Embedded Template Library.
7 
8 Copyright(c) 2014 jwellbelove
9 
10 Permission is hereby granted, free of charge, to any person obtaining a copy
11 of this software and associated documentation files(the "Software"), to deal
12 in the Software without restriction, including without limitation the rights
13 to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
14 copies of the Software, and to permit persons to whom the Software is
15 furnished to do so, subject to the following conditions :
16 
17 The above copyright notice and this permission notice shall be included in all
18 copies or substantial portions of the Software.
19 
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
23 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 SOFTWARE.
27 ******************************************************************************/
28 
29 #ifndef __ETL_FNV_1__
30 #define __ETL_FNV_1__
31 
32 #include <stdint.h>
33 
34 #include "static_assert.h"
35 #include "type_traits.h"
36 #include "endian.h"
37 
40 
41 namespace etl
42 {
43  //***************************************************************************
47  //***************************************************************************
48  template <const int ENDIANNESS = endian::little>
49  class fnv_1_64
50  {
51  public:
52 
53  typedef uint64_t value_type;
54 
55  //*************************************************************************
57  //*************************************************************************
59  {
60  reset();
61  }
62 
63  //*************************************************************************
67  //*************************************************************************
68  template<typename TIterator>
69  fnv_1_64(TIterator begin, const TIterator end)
70  {
71  reset();
72  add(begin, end);
73  }
74 
75  //*************************************************************************
77  //*************************************************************************
78  void reset()
79  {
80  hash = OFFSET_BASIS;
81  }
82 
83  //*************************************************************************
85  //*************************************************************************
86  template<typename TValue>
87  void add(TValue value)
88  {
89  STATIC_ASSERT(is_integral<TValue>::value, "Non-integral parameter");
90 
91  if (ENDIANNESS == endian::little)
92  {
93  for (int i = 0; i < sizeof(TValue); ++i)
94  {
95  add(uint8_t((value >> (i * 8)) & 0xFF));
96  }
97  }
98  else
99  {
100  for (int i = sizeof(TValue) - 1; i >= 0; --i)
101  {
102  add(uint8_t((value >> (i * 8)) & 0xFF));
103  }
104  }
105  }
106 
107  //*************************************************************************
109  //*************************************************************************
110  void add(uint8_t value)
111  {
112  hash *= PRIME;
113  hash ^= value;
114  }
115 
116  //*************************************************************************
120  //*************************************************************************
121  template<typename TIterator>
122  void add(TIterator begin, const TIterator end)
123  {
124  while (begin != end)
125  {
126  add(*begin++);
127  }
128  }
129 
130  //*************************************************************************
132  //*************************************************************************
133  value_type value() const
134  {
135  return hash;
136  }
137 
138  //*************************************************************************
140  //*************************************************************************
141  template<typename TValue>
143  {
144  add(value);
145 
146  return *this;
147  }
148 
149  //*************************************************************************
151  //*************************************************************************
152  operator value_type () const
153  {
154  return hash;
155  }
156 
157  private:
158 
159  value_type hash;
160 
161  static const uint64_t OFFSET_BASIS = 0xCBF29CE484222325;
162  static const uint64_t PRIME = 0x00000100000001b3;
163  };
164 
165  //***************************************************************************
169  //***************************************************************************
170  template <const int ENDIANNESS = endian::little>
171  class fnv_1a_64
172  {
173  public:
174 
175  typedef uint64_t value_type;
176 
177  //*************************************************************************
179  //*************************************************************************
181  {
182  reset();
183  }
184 
185  //*************************************************************************
189  //*************************************************************************
190  template<typename TIterator>
191  fnv_1a_64(TIterator begin, const TIterator end)
192  {
193  reset();
194  add(begin, end);
195  }
196 
197  //*************************************************************************
199  //*************************************************************************
200  void reset()
201  {
202  hash = OFFSET_BASIS;
203  }
204 
205  //*************************************************************************
207  //*************************************************************************
208  template<typename TValue>
209  void add(TValue value)
210  {
211  STATIC_ASSERT(is_integral<TValue>::value, "Non-integral parameter");
212 
213  if (ENDIANNESS == endian::little)
214  {
215  for (int i = 0; i < sizeof(TValue); ++i)
216  {
217  add(uint8_t((value >> (i * 8)) & 0xFF));
218  }
219  }
220  else
221  {
222  for (int i = sizeof(TValue) - 1; i >= 0; --i)
223  {
224  add(uint8_t((value >> (i * 8)) & 0xFF));
225  }
226  }
227  }
228 
229  //*************************************************************************
231  //*************************************************************************
232  void add(uint8_t value)
233  {
234  hash ^= value;
235  hash *= PRIME;
236  }
237 
238  //*************************************************************************
241  //*************************************************************************
242  template<typename TIterator>
243  void add(TIterator begin, const TIterator end)
244  {
245  while (begin != end)
246  {
247  add(*begin++);
248  }
249  }
250 
251  //*************************************************************************
253  //*************************************************************************
254  value_type value() const
255  {
256  return hash;
257  }
258 
259  //*************************************************************************
261  //*************************************************************************
262  template<typename TValue>
264  {
265  add(value);
266 
267  return *this;
268  }
269 
270  //*************************************************************************
272  //*************************************************************************
273  operator value_type () const
274  {
275  return hash;
276  }
277 
278  private:
279 
280  value_type hash;
281 
282  static const uint64_t OFFSET_BASIS = 0xCBF29CE484222325;
283  static const uint64_t PRIME = 0x00000100000001b3;
284  };
285 
286  //***************************************************************************
290  //***************************************************************************
291  template <const int ENDIANNESS = endian::little>
292  class fnv_1_32
293  {
294  public:
295 
296  typedef uint32_t value_type;
297 
298  //*************************************************************************
300  //*************************************************************************
302  {
303  reset();
304  }
305 
306  //*************************************************************************
310  //*************************************************************************
311  template<typename TIterator>
312  fnv_1_32(TIterator begin, const TIterator end)
313  {
314  reset();
315  add(begin, end);
316  }
317 
318  //*************************************************************************
320  //*************************************************************************
321  void reset()
322  {
323  hash = OFFSET_BASIS;
324  }
325 
326  //*************************************************************************
328  //*************************************************************************
329  template<typename TValue>
330  void add(TValue value)
331  {
332  STATIC_ASSERT(is_integral<TValue>::value, "Non-integral parameter");
333 
334  if (ENDIANNESS == endian::little)
335  {
336  for (int i = 0; i < sizeof(TValue); ++i)
337  {
338  add(uint8_t((value >> (i * 8)) & 0xFF));
339  }
340  }
341  else
342  {
343  for (int i = sizeof(TValue) - 1; i >= 0; --i)
344  {
345  add(uint8_t((value >> (i * 8)) & 0xFF));
346  }
347  }
348  }
349 
350  //*************************************************************************
352  //*************************************************************************
353  void add(uint8_t value)
354  {
355  hash *= PRIME;
356  hash ^= value;
357  }
358 
359  //*************************************************************************
362  //*************************************************************************
363  template<typename TIterator>
364  void add(TIterator begin, const TIterator end)
365  {
366  while (begin != end)
367  {
368  add(*begin++);
369  }
370  }
371 
372  //*************************************************************************
374  //*************************************************************************
375  value_type value() const
376  {
377  return hash;
378  }
379 
380  //*************************************************************************
382  //*************************************************************************
383  template<typename TValue>
385  {
386  add(value);
387 
388  return *this;
389  }
390 
391  //*************************************************************************
393  //*************************************************************************
394  operator value_type () const
395  {
396  return hash;
397  }
398 
399  private:
400 
401  value_type hash;
402 
403  static const uint32_t OFFSET_BASIS = 0x811C9DC5;
404  static const uint32_t PRIME = 0x01000193;
405  };
406 
407  //***************************************************************************
411  //***************************************************************************
412  template <const int ENDIANNESS = endian::little>
413  class fnv_1a_32
414  {
415  public:
416 
417  typedef uint32_t value_type;
418 
419  //*************************************************************************
421  //*************************************************************************
423  {
424  reset();
425  }
426 
427  //*************************************************************************
431  //*************************************************************************
432  template<typename TIterator>
433  fnv_1a_32(TIterator begin, const TIterator end)
434  {
435  reset();
436  add(begin, end);
437  }
438 
439  //*************************************************************************
441  //*************************************************************************
442  void reset()
443  {
444  hash = OFFSET_BASIS;
445  }
446 
447  //*************************************************************************
449  //*************************************************************************
450  template<typename TValue>
451  void add(TValue value)
452  {
453  STATIC_ASSERT(is_integral<TValue>::value, "Non-integral parameter");
454 
455  if (ENDIANNESS == endian::little)
456  {
457  for (int i = 0; i < sizeof(TValue); ++i)
458  {
459  add(uint8_t((value >> (i * 8)) & 0xFF));
460  }
461  }
462  else
463  {
464  for (int i = sizeof(TValue) - 1; i >= 0; --i)
465  {
466  add(uint8_t((value >> (i * 8)) & 0xFF));
467  }
468  }
469  }
470 
471  //*************************************************************************
473  //*************************************************************************
474  void add(uint8_t value)
475  {
476  hash ^= value;
477  hash *= PRIME;
478  }
479 
480  //*************************************************************************
483  //*************************************************************************
484  template<typename TIterator>
485  void add(TIterator begin, const TIterator end)
486  {
487  while (begin != end)
488  {
489  add(*begin++);
490  }
491  }
492 
493  //*************************************************************************
495  //*************************************************************************
496  value_type value() const
497  {
498  return hash;
499  }
500 
501  //*************************************************************************
503  //*************************************************************************
504  template<typename TValue>
506  {
507  add(value);
508 
509  return *this;
510  }
511 
512  //*************************************************************************
514  //*************************************************************************
515  operator value_type () const
516  {
517  return hash;
518  }
519 
520  private:
521 
522  value_type hash;
523 
524  static const uint32_t OFFSET_BASIS = 0x811C9DC5;
525  static const uint32_t PRIME = 0x01000193;
526  };
527 }
528 
529 #endif
void add(TValue value)
Definition: fnv_1.h:330
fnv_1a_32()
Default constructor.
Definition: fnv_1.h:422
Definition: fnv_1.h:49
Definition: fnv_1.h:292
fnv_1_32()
Default constructor.
Definition: fnv_1.h:301
fnv_1_64(TIterator begin, const TIterator end)
Definition: fnv_1.h:69
fnv_1a_64()
Default constructor.
Definition: fnv_1.h:180
value_type value() const
Gets the fnv_1a_64 value.
Definition: fnv_1.h:254
Definition: hash.h:71
Definition: type_traits.h:130
value_type value() const
Gets the fnv_1a_32 value.
Definition: fnv_1.h:496
void add(uint8_t value)
Definition: fnv_1.h:110
Definition: fnv_1.h:413
fnv_1a_64(TIterator begin, const TIterator end)
Definition: fnv_1.h:191
fnv_1a_32(TIterator begin, const TIterator end)
Definition: fnv_1.h:433
Definition: algorithm.h:43
fnv_1_32< ENDIANNESS > & operator+=(TValue value)
Definition: fnv_1.h:384
Definition: fnv_1.h:171
void reset()
Resets the CRC to the initial state.
Definition: fnv_1.h:200
void add(TIterator begin, const TIterator end)
Definition: fnv_1.h:364
TContainer::iterator end(TContainer &container)
Definition: container.h:95
TContainer::iterator begin(TContainer &container)
Definition: container.h:45
fnv_1a_64< ENDIANNESS > & operator+=(TValue value)
Definition: fnv_1.h:263
void add(TIterator begin, const TIterator end)
Definition: fnv_1.h:243
void add(uint8_t value)
Definition: fnv_1.h:474
fnv_1_64< ENDIANNESS > & operator+=(TValue value)
Definition: fnv_1.h:142
void reset()
Resets the CRC to the initial state.
Definition: fnv_1.h:78
value_type value() const
Gets the fnv_1_32 value.
Definition: fnv_1.h:375
fnv_1_64()
Default constructor.
Definition: fnv_1.h:58
void add(TValue value)
Definition: fnv_1.h:87
fnv_1_32(TIterator begin, const TIterator end)
Definition: fnv_1.h:312
void reset()
Resets the CRC to the initial state.
Definition: fnv_1.h:442
void add(TValue value)
Definition: fnv_1.h:451
void add(TIterator begin, const TIterator end)
Definition: fnv_1.h:122
void add(uint8_t value)
Definition: fnv_1.h:232
void add(TValue value)
Definition: fnv_1.h:209
void add(TIterator begin, const TIterator end)
Definition: fnv_1.h:485
value_type value() const
Gets the fnv_1_64 value.
Definition: fnv_1.h:133
fnv_1a_32< ENDIANNESS > & operator+=(TValue value)
Definition: fnv_1.h:505
void add(uint8_t value)
Definition: fnv_1.h:353
void reset()
Resets the CRC to the initial state.
Definition: fnv_1.h:321