ezEngine  Milestone 7
HashingMurmur_inl.h
1 
2 namespace ezInternal
3 {
4  enum
5  {
6  MURMUR_M = 0x5bd1e995,
7  MURMUR_R = 24
8  };
9 
10  template <size_t N>
11  EZ_FORCE_INLINE ezUInt32 CompileTimeMurmurHash(ezUInt32 hash, const char* str, size_t i)
12  {
13  return CompileTimeMurmurHash<N-4>(CompileTimeMurmurHash<4>(hash, str, i), str, i+4);
14  }
15 
16  template <>
17  EZ_FORCE_INLINE ezUInt32 CompileTimeMurmurHash<4>(ezUInt32 hash, const char* str, size_t i)
18  {
19  ezUInt32 k = ((str[i+0]) | ((str[i+1])<<8) | ((str[i+2]) << 16) | ((str[i+3]) << 24));
20  k *= MURMUR_M;
21  k ^= (k >> MURMUR_R);
22  k *= MURMUR_M;
23  return (hash * MURMUR_M) ^ k;
24  }
25 
26  template <>
27  EZ_FORCE_INLINE ezUInt32 CompileTimeMurmurHash<3>(ezUInt32 hash, const char* str, size_t i)
28  {
29  return (hash ^ (str[i+2] << 16) ^ (str[i+1] << 8) ^ (str[i+0])) * MURMUR_M;
30  }
31 
32  template <>
33  EZ_FORCE_INLINE ezUInt32 CompileTimeMurmurHash<2>(ezUInt32 hash, const char* str, size_t i)
34  {
35  return (hash ^ (str[i+1] << 8) ^ (str[i])) * MURMUR_M;
36  }
37 
38  template <>
39  EZ_FORCE_INLINE ezUInt32 CompileTimeMurmurHash<1>(ezUInt32 hash, const char* str, size_t i)
40  {
41  return (hash ^ (str[i])) * MURMUR_M;
42  }
43 
44  template <>
45  EZ_FORCE_INLINE ezUInt32 CompileTimeMurmurHash<0>(ezUInt32 hash, const char* str, size_t i)
46  {
47  return hash;
48  }
49 }
50 
51 template <size_t N>
52 EZ_FORCE_INLINE ezUInt32 ezHashing::MurmurHash(const char (&str)[N], ezUInt32 uiSeed)
53 {
54  const ezUInt32 uiStrlen = (ezUInt32)(N - 1);
55  ezUInt32 h = ezInternal::CompileTimeMurmurHash<N - 1>(uiSeed ^ uiStrlen, str, 0);
56  h ^= h >> 13;
57  h *= ezInternal::MURMUR_M;
58  h ^= h >> 15;
59  return h;
60 }
61 
62 EZ_FORCE_INLINE ezUInt32 ezHashing::MurmurHash(StringWrapper str, ezUInt32 uiSeed)
63 {
64  return MurmurHash(str.m_str, std::strlen(str.m_str), uiSeed);
65 }
66