spot  2.11.6
hashfunc.hh
1 // -*- coding: utf-8 -*-
2 // Copyright (C) 2015, 2018 Laboratoire de Recherche et Développement
3 // de l'Epita (LRDE)
4 // Copyright (C) 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
5 // département Systèmes Répartis Coopératifs (SRC), Université Pierre
6 // et Marie Curie.
7 //
8 // This file is part of Spot, a model checking library.
9 //
10 // Spot is free software; you can redistribute it and/or modify it
11 // under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // Spot is distributed in the hope that it will be useful, but WITHOUT
16 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 // License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program. If not, see <http://www.gnu.org/licenses/>.
22 
23 #pragma once
24 
25 #include <cstddef>
26 #include <type_traits>
27 
28 namespace spot
29 {
32 
35 
40  inline size_t
41  wang32_hash(size_t key)
42  {
43  // We assume that size_t has at least 32bits.
44  key += ~(key << 15);
45  key ^= (key >> 10);
46  key += (key << 3);
47  key ^= (key >> 6);
48  key += ~(key << 11);
49  key ^= (key >> 16);
50  return key;
51  }
52 
59  inline size_t
60  knuth32_hash(size_t key)
61  {
62  // 2654435761 is the golden ratio of 2^32. The right shift of 3
63  // bits assumes that all objects are aligned on a 8 byte boundary.
64  return (key >> 3) * 2654435761U;
65  }
66 
67 
69  template<class T, class Enable = void>
70  struct fnv
71  {};
72 
74  template<class T>
75  struct fnv<T, typename std::enable_if<sizeof(T) == 4>::type>
76  {
77  static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value,
78  "Fowler-Noll-Vo hash requires an unsigned integral type");
79  static constexpr T init = 2166136261UL;
80  static constexpr T prime = 16777619UL;
81  };
82 
84  template<class T>
85  struct fnv<T, typename std::enable_if<sizeof(T) == 8>::type>
86  {
87  static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value,
88  "Fowler-Noll-Vo hash requires an unsigned integral type");
89  static constexpr T init = 14695981039346656037ULL;
90  static constexpr T prime = 1099511628211ULL;
91  };
92 
97  template<class It>
98  size_t
99  fnv_hash(It begin, It end)
100  {
101  size_t res = fnv<size_t>::init;
102  for (; begin != end; ++begin)
103  {
104  res ^= *begin;
105  res *= fnv<size_t>::prime;
106  }
107  return res;
108  }
109 
111 }
size_t fnv_hash(It begin, It end)
Fowler-Noll-Vo hash function.
Definition: hashfunc.hh:99
size_t wang32_hash(size_t key)
Thomas Wang's 32 bit hash function.
Definition: hashfunc.hh:41
size_t knuth32_hash(size_t key)
Knuth's Multiplicative hash function.
Definition: hashfunc.hh:60
Definition: automata.hh:27
Struct for Fowler-Noll-Vo parameters.
Definition: hashfunc.hh:71

Please direct any question, comment, or bug report to the Spot mailing list at spot@lrde.epita.fr.
Generated on Fri Feb 27 2015 10:00:07 for spot by doxygen 1.9.1