- 1./// @brief BKDR Hash Function
2./// @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。
3.template<class T>
4.size_t BKDRHash(const T *str)
5.{
6. register size_t hash = 0;
7. while (size_t ch = (size_t)*str++)
8. {
9. hash = hash * 131 + ch; // 也可以乘以31、131、1313、13131、131313..
10. // 有人说将乘法分解为位运算及加减法可以提高效率,如将上式表达为:hash = hash << 7 + hash << 1 + hash + ch;
11. // 但其实在Intel平台上,CPU内部对二者的处理效率都是差不多的,
12. // 我分别进行了100亿次的上述两种运算,发现二者时间差距基本为0(如果是Debug版,分解成位运算后的耗时还要高1/3);
13. // 在ARM这类RISC系统上没有测试过,由于ARM内部使用Booth's Algorithm来模拟32位整数乘法运算,它的效率与乘数有关:
14. // 当乘数8-31位都为1或0时,需要1个时钟周期
15. // 当乘数16-31位都为1或0时,需要2个时钟周期
16. // 当乘数24-31位都为1或0时,需要3个时钟周期
17. // 否则,需要4个时钟周期
18. // 因此,虽然我没有实际测试,但是我依然认为二者效率上差别不大
19. }
20. return hash;
21.}
22./// @brief SDBM Hash Function
23./// @detail 本算法是由于在开源项目SDBM(一种简单的数据库引擎)中被应用而得名,它与BKDRHash思想一致,只是种子不同而已。
24.template<class T>
25.size_t SDBMHash(const T *str)
26.{
27. register size_t hash = 0;
28. while (size_t ch = (size_t)*str++)
29. {
30. hash = 65599 * hash + ch;
31. //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;
32. }
33. return hash;
34.}
35./// @brief RS Hash Function
36./// @detail 因Robert Sedgwicks在其《Algorithms in C》一书中展示而得名。
37.template<class T>
38.size_t RSHash(const T *str)
39.{
40. register size_t hash = 0;
41. size_t magic = 63689;
42. while (size_t ch = (size_t)*str++)
43. {
44. hash = hash * magic + ch;
45. magic *= 378551;
46. }
47. return hash;
48.}
49./// @brief AP Hash Function
50./// @detail 由Arash Partow发明的一种hash算法。
51.template<class T>
52.size_t APHash(const T *str)
53.{
54. register size_t hash = 0;
55. size_t ch;
56. for (long i = 0; ch = (size_t)*str++; i++)
57. {
58. if ((i & 1) == 0)
59. {
60. hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
61. }
62. else
63. {
64. hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
65. }
66. }
67. return hash;
68.}
69./// @brief JS Hash Function
70./// 由Justin Sobel发明的一种hash算法。
71.template<class T>
72.size_t JSHash(const T *str)
73.{
74. if(!*str) // 这是由本人添加,以保证空字符串返回哈希值0
75. return 0;
76. register size_t hash = 1315423911;
77. while (size_t ch = (size_t)*str++)
78. {
79. hash ^= ((hash << 5) + ch + (hash >> 2));
80. }
81. return hash;
82.}
83./// @brief DEK Function
84./// @detail 本算法是由于Donald E. Knuth在《Art Of Computer Programming Volume 3》中展示而得名。
85.template<class T>
86.size_t DEKHash(const T* str)
87.{
88. if(!*str) // 这是由本人添加,以保证空字符串返回哈希值0
89. return 0;
90. register size_t hash = 1315423911;
91. while (size_t ch = (size_t)*str++)
92. {
93. hash = ((hash << 5) ^ (hash >> 27)) ^ ch;
94. }
95. return hash;
96.}
97./// @brief FNV Hash Function
98./// @detail Unix system系统中使用的一种著名hash算法,后来微软也在其hash_map中实现。
99.template<class T>
100.size_t FNVHash(const T* str)
101.{
102. if(!*str) // 这是由本人添加,以保证空字符串返回哈希值0
103. return 0;
104. register size_t hash = 2166136261;
105. while (size_t ch = (size_t)*str++)
106. {
107. hash *= 16777619;
108. hash ^= ch;
109. }
110. return hash;
111.}
112./// @brief DJB Hash Function
113./// @detail 由Daniel J. Bernstein教授发明的一种hash算法。
114.template<class T>
115.size_t DJBHash(const T *str)
116.{
117. if(!*str) // 这是由本人添加,以保证空字符串返回哈希值0
118. return 0;
119. register size_t hash = 5381;
120. while (size_t ch = (size_t)*str++)
121. {
122. hash += (hash << 5) + ch;
123. }
124. return hash;
125.}
126./// @brief DJB Hash Function 2
127./// @detail 由Daniel J. Bernstein 发明的另一种hash算法。
128.template<class T>
129.size_t DJB2Hash(const T *str)
130.{
131. if(!*str) // 这是由本人添加,以保证空字符串返回哈希值0
132. return 0;
133. register size_t hash = 5381;
134. while (size_t ch = (size_t)*str++)
135. {
136. hash = hash * 33 ^ ch;
137. }
138. return hash;
139.}
140./// @brief PJW Hash Function
141./// @detail 本算法是基于AT&T贝尔实验室的Peter J. Weinberger的论文而发明的一种hash算法。
142.template<class T>
143.size_t PJWHash(const T *str)
144.{
145. static const size_t TotalBits = sizeof(size_t) * 8;
146. static const size_t ThreeQuarters = (TotalBits * 3) / 4;
147. static const size_t OneEighth = TotalBits / 8;
148. static const size_t HighBits = ((size_t)-1) << (TotalBits - OneEighth);
149.
150. register size_t hash = 0;
151. size_t magic = 0;
152. while (size_t ch = (size_t)*str++)
153. {
154. hash = (hash << OneEighth) + ch;
155. if ((magic = hash & HighBits) != 0)
156. {
157. hash = ((hash ^ (magic >> ThreeQuarters)) & (~HighBits));
158. }
159. }
160. return hash;
161.}
162./// @brief ELF Hash Function
163./// @detail 由于在Unix的Extended Library Function被附带而得名的一种hash算法,它其实就是PJW Hash的变形。
164.template<class T>
165.size_t ELFHash(const T *str)
166.{
167. static const size_t TotalBits = sizeof(size_t) * 8;
168. static const size_t ThreeQuarters = (TotalBits * 3) / 4;
169. static const size_t OneEighth = TotalBits / 8;
170. static const size_t HighBits = ((size_t)-1) << (TotalBits - OneEighth);
171. register size_t hash = 0;
172. size_t magic = 0;
173. while (size_t ch = (size_t)*str++)
174. {
175. hash = (hash << OneEighth) + ch;
176. if ((magic = hash & HighBits) != 0)
177. {
178. hash ^= (magic >> ThreeQuarters);
179. hash &= ~magic;
180. }
181. }
182. return hash;
183.}
字符串哈希算法
最新推荐文章于 2023-02-24 21:00:00 发布