Teuchos - Trilinos Tools Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_HashUtils.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Teuchos: Common Tools Package
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef TEUCHOS_HASHUTILS_H
43 #define TEUCHOS_HASHUTILS_H
44 
49 #include "Teuchos_ConfigDefs.hpp"
50 
51 namespace Teuchos
52 {
53  using std::string;
54 
66  class TEUCHOSCORE_LIB_DLL_EXPORT HashUtils
67  {
68  public:
69  /* Get the next prime in a sequence of hashtable sizes */
70  static int nextPrime(int newCapacity);
71  static int getHashCode(const unsigned char *a, size_t len);
72 
73  private:
74 
75  // sequence of primes generated via mathematica:
76  // Table[Prime[Round[1.5^x]], {x, 8, 36}]
77  static const int primeCount_;
78  static const int primes_[];
79  /*={101, 163, 271, 443, 733, 1187, 1907, 3061,
80  4919, 7759, 12379, 19543, 30841, 48487, 75989,
81  119089, 185971, 290347, 452027, 703657, 1093237,
82  1695781, 2627993, 4067599, 6290467, 9718019,
83  15000607, 23133937, 35650091};*/
84  };
85 
86 
90  template <class T> int hashCode(const T& x);
91 
95  template <> inline int hashCode(const int& x)
96  {
97  return x;
98  }
99 
103  template <> inline int hashCode(const unsigned& x)
104  {
105  return HashUtils::getHashCode(
106  reinterpret_cast<const unsigned char *>(&x), sizeof(unsigned));
107  }
108 
112  template <> inline int hashCode(const double& x)
113  {
114  return HashUtils::getHashCode(
115  reinterpret_cast<const unsigned char *>(&x), sizeof(double));
116  }
117 
121  template <> inline int hashCode(const bool& x)
122  {
123  return (int) x;
124  }
125 
129  template <> inline int hashCode(const long long& x)
130  {
131  return HashUtils::getHashCode(
132  reinterpret_cast<const unsigned char *>(&x), sizeof(long long));
133  }
134 
138  template <> inline int hashCode(const long& x)
139  {
140  return HashUtils::getHashCode(
141  reinterpret_cast<const unsigned char *>(&x), sizeof(long));
142  }
143 
147  template <> inline int hashCode(const std::string& x)
148  {
149  /* This specialization could use the HashUtils::getHashCode as well,
150  * but they are both true hashes anyway, so leaving it !
151  * */
152  const char* str = x.c_str();
153  int len = static_cast<int>(x.length());
154  int step = len/4 + 1;
155  int base = 1;
156  int rtn = 0;
157 
158  for (int i=0; i<len/2; i+=step)
159  {
160  rtn += base*(int) str[i];
161  base *= 128;
162  rtn += base*(int) str[len-i-1];
163  base *= 128;
164  }
165 
166  if (rtn < 0)
167  {
168  /* Convert the largest -ve int to zero and -1 to
169  * std::numeric_limits<int>::max()
170  * */
171  size_t maxIntBeforeWrap = std::numeric_limits<int>::max();
172  maxIntBeforeWrap ++;
173  rtn += maxIntBeforeWrap;
174  }
175  return rtn;
176  }
177 
178 }
179 #endif // TEUCHOS_HASHUTILS_H
int hashCode(const double &x)
Get the hash code of a double.
int hashCode(const std::string &x)
Get the hash code of a std::string.
Utilities for generating hashcodes. This is not a true hash ! For all ints and types less than ints i...
Teuchos header file which uses auto-configuration information to include necessary C++ headers...
static int getHashCode(const unsigned char *a, size_t len)
int hashCode(const long &x)
Get the hash code of a long.
int hashCode(const unsigned &x)
Get the hash code of an unsigned.
int hashCode(const int &x)
Get the hash code of an int.
int hashCode(const long long &x)
Get the hash code of a long long.
int hashCode(const bool &x)
Get the hash code of a bool.