ezEngine  Milestone 7
Hashing_inl.h
1 #include <Foundation/Strings/Implementation/StringBase.h>
2 
3 namespace ezInternal
4 {
5  template <typename T, bool isString>
7  {
8  static ezUInt32 Hash(const T& value);
9  };
10 
11  template <typename T>
12  struct HashHelperImpl<T, true>
13  {
14  template <class Derived>
15  EZ_FORCE_INLINE static ezUInt32 Hash(const ezStringBase<Derived>& string)
16  {
17  return ezHashing::MurmurHash((void*)string.InternalGetData(), string.InternalGetElementCount());
18  }
19  };
20 
21  template <typename T, bool isString>
22  EZ_FORCE_INLINE ezUInt32 HashHelperImpl<T, isString>::Hash(const T& value)
23  {
24  EZ_CHECK_AT_COMPILETIME_MSG(isString, "ezHashHelper is not implemented for the given type.");
25  return 0;
26  }
27 }
28 
29 template <typename T>
30 EZ_FORCE_INLINE ezUInt32 ezHashHelper<T>::Hash(const T& value)
31 {
33 }
34 
35 template <typename T>
36 EZ_FORCE_INLINE bool ezHashHelper<T>::Equal(const T& a, const T& b)
37 {
38  return a == b;
39 }
40 
41 
42 
43 template <>
44 struct ezHashHelper<ezUInt32>
45 {
46  EZ_FORCE_INLINE static ezUInt32 Hash(ezUInt32 value)
47  {
48  // knuth: multiplication by the golden ratio will minimize gaps in the hash space.
49  // 2654435761U: prime close to 2^32/phi with phi = golden ratio (sqrt(5) - 1) / 2
50  return value * 2654435761U;
51  }
52 
53  EZ_FORCE_INLINE static bool Equal(ezUInt32 a, ezUInt32 b)
54  {
55  return a == b;
56  }
57 };
58 
59 template <>
60 struct ezHashHelper<ezInt32>
61 {
62  EZ_FORCE_INLINE static ezUInt32 Hash(ezInt32 value)
63  {
64  return value * 2654435761U;
65  }
66 
67  EZ_FORCE_INLINE static bool Equal(ezInt32 a, ezInt32 b)
68  {
69  return a == b;
70  }
71 };
72 
73 template <>
74 struct ezHashHelper<ezUInt64>
75 {
76  EZ_FORCE_INLINE static ezUInt32 Hash(ezUInt64 value)
77  {
78  return ezUInt32(value * 2654435761U);
79  }
80 
81  EZ_FORCE_INLINE static bool Equal(ezUInt64 a, ezUInt64 b)
82  {
83  return a == b;
84  }
85 };
86 
87 template <>
88 struct ezHashHelper<ezInt64>
89 {
90  EZ_FORCE_INLINE static ezUInt32 Hash(ezInt64 value)
91  {
92  return ezUInt32(value * 2654435761U);
93  }
94 
95  EZ_FORCE_INLINE static bool Equal(ezInt64 a, ezInt64 b)
96  {
97  return a == b;
98  }
99 };
100 
101 template <>
102 struct ezHashHelper<const char*>
103 {
104  EZ_FORCE_INLINE static ezUInt32 Hash(const char* szValue)
105  {
106  return ezHashing::MurmurHash(szValue);
107  }
108 
109  EZ_FORCE_INLINE static bool Equal(const char* a, const char* b)
110  {
111  return ezStringUtils::IsEqual(a, b);
112  }
113 };
114 
115 template <typename T>
116 struct ezHashHelper<T*>
117 {
118  EZ_FORCE_INLINE static ezUInt32 Hash(T* value)
119  {
120  return ezUInt32((reinterpret_cast<size_t>(value) << 4) * 2654435761U);
121  }
122 
123  EZ_FORCE_INLINE static bool Equal(T* a, T* b)
124  {
125  return a == b;
126  }
127 };
128