StringHasher.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. /*
  2. * Copyright (C) 2013 Apple Inc. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
  14. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  15. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
  17. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  18. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  19. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  21. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  22. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  23. * THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include "config.h"
  26. #include <wtf/StringHasher.h>
  27. namespace TestWebKitAPI {
  28. static const LChar nullLChars[2] = { 0, 0 };
  29. static const UChar nullUChars[2] = { 0, 0 };
  30. static const unsigned emptyStringHash = 0x4EC889EU;
  31. static const unsigned singleNullCharacterHash = 0x3D3ABF44U;
  32. static const LChar testALChars[6] = { 0x41, 0x95, 0xFF, 0x50, 0x01, 0 };
  33. static const UChar testAUChars[6] = { 0x41, 0x95, 0xFF, 0x50, 0x01, 0 };
  34. static const UChar testBUChars[6] = { 0x41, 0x95, 0xFFFF, 0x1080, 0x01, 0 };
  35. static const unsigned testAHash1 = 0xEA32B004;
  36. static const unsigned testAHash2 = 0x93F0F71E;
  37. static const unsigned testAHash3 = 0xCB609EB1;
  38. static const unsigned testAHash4 = 0x7984A706;
  39. static const unsigned testAHash5 = 0x0427561F;
  40. static const unsigned testBHash1 = 0xEA32B004;
  41. static const unsigned testBHash2 = 0x93F0F71E;
  42. static const unsigned testBHash3 = 0x59EB1B2C;
  43. static const unsigned testBHash4 = 0xA7BCCC0A;
  44. static const unsigned testBHash5 = 0x79201649;
  45. TEST(WTF, StringHasher)
  46. {
  47. StringHasher hasher;
  48. // The initial state of the hasher.
  49. ASSERT_EQ(emptyStringHash, hasher.hash());
  50. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  51. }
  52. TEST(WTF, StringHasher_addCharacter)
  53. {
  54. StringHasher hasher;
  55. // Hashing a single character.
  56. hasher = StringHasher();
  57. hasher.addCharacter(0);
  58. ASSERT_EQ(singleNullCharacterHash, hasher.hash());
  59. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  60. // Hashing five characters, checking the intermediate state after each is added.
  61. hasher = StringHasher();
  62. hasher.addCharacter(testAUChars[0]);
  63. ASSERT_EQ(testAHash1, hasher.hash());
  64. ASSERT_EQ(testAHash1 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  65. hasher.addCharacter(testAUChars[1]);
  66. ASSERT_EQ(testAHash2, hasher.hash());
  67. ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  68. hasher.addCharacter(testAUChars[2]);
  69. ASSERT_EQ(testAHash3, hasher.hash());
  70. ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  71. hasher.addCharacter(testAUChars[3]);
  72. ASSERT_EQ(testAHash4, hasher.hash());
  73. ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  74. hasher.addCharacter(testAUChars[4]);
  75. ASSERT_EQ(testAHash5, hasher.hash());
  76. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  77. // Hashing a second set of five characters, including non-Latin-1 characters.
  78. hasher = StringHasher();
  79. hasher.addCharacter(testBUChars[0]);
  80. ASSERT_EQ(testBHash1, hasher.hash());
  81. ASSERT_EQ(testBHash1 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  82. hasher.addCharacter(testBUChars[1]);
  83. ASSERT_EQ(testBHash2, hasher.hash());
  84. ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  85. hasher.addCharacter(testBUChars[2]);
  86. ASSERT_EQ(testBHash3, hasher.hash());
  87. ASSERT_EQ(testBHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  88. hasher.addCharacter(testBUChars[3]);
  89. ASSERT_EQ(testBHash4, hasher.hash());
  90. ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  91. hasher.addCharacter(testBUChars[4]);
  92. ASSERT_EQ(testBHash5, hasher.hash());
  93. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  94. }
  95. TEST(WTF, StringHasher_addCharacters)
  96. {
  97. StringHasher hasher;
  98. // Hashing zero characters.
  99. hasher = StringHasher();
  100. hasher.addCharacters(static_cast<LChar*>(0), 0);
  101. ASSERT_EQ(emptyStringHash, hasher.hash());
  102. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  103. hasher = StringHasher();
  104. hasher.addCharacters(nullLChars, 0);
  105. ASSERT_EQ(emptyStringHash, hasher.hash());
  106. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  107. hasher = StringHasher();
  108. hasher.addCharacters(nullLChars);
  109. ASSERT_EQ(emptyStringHash, hasher.hash());
  110. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  111. hasher = StringHasher();
  112. hasher.addCharacters(static_cast<UChar*>(0), 0);
  113. ASSERT_EQ(emptyStringHash, hasher.hash());
  114. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  115. hasher = StringHasher();
  116. hasher.addCharacters(nullUChars, 0);
  117. ASSERT_EQ(emptyStringHash, hasher.hash());
  118. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  119. hasher = StringHasher();
  120. hasher.addCharacters(nullUChars);
  121. ASSERT_EQ(emptyStringHash, hasher.hash());
  122. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  123. // Hashing one character.
  124. hasher = StringHasher();
  125. hasher.addCharacters(nullLChars, 1);
  126. ASSERT_EQ(singleNullCharacterHash, hasher.hash());
  127. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  128. hasher = StringHasher();
  129. hasher.addCharacters(nullUChars, 1);
  130. ASSERT_EQ(singleNullCharacterHash, hasher.hash());
  131. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  132. // Hashing five characters, all at once.
  133. hasher = StringHasher();
  134. hasher.addCharacters(testALChars, 5);
  135. ASSERT_EQ(testAHash5, hasher.hash());
  136. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  137. hasher = StringHasher();
  138. hasher.addCharacters(testALChars);
  139. ASSERT_EQ(testAHash5, hasher.hash());
  140. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  141. hasher = StringHasher();
  142. hasher.addCharacters(testAUChars, 5);
  143. ASSERT_EQ(testAHash5, hasher.hash());
  144. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  145. hasher = StringHasher();
  146. hasher.addCharacters(testAUChars);
  147. ASSERT_EQ(testAHash5, hasher.hash());
  148. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  149. hasher = StringHasher();
  150. hasher.addCharacters(testBUChars, 5);
  151. ASSERT_EQ(testBHash5, hasher.hash());
  152. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  153. hasher = StringHasher();
  154. hasher.addCharacters(testBUChars);
  155. ASSERT_EQ(testBHash5, hasher.hash());
  156. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  157. // Hashing five characters, in groups of two, then the last one.
  158. hasher = StringHasher();
  159. hasher.addCharacters(testALChars, 2);
  160. ASSERT_EQ(testAHash2, hasher.hash());
  161. ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  162. hasher.addCharacters(testALChars + 2, 2);
  163. ASSERT_EQ(testAHash4, hasher.hash());
  164. ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  165. hasher.addCharacters(testALChars + 4, 1);
  166. ASSERT_EQ(testAHash5, hasher.hash());
  167. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  168. hasher = StringHasher();
  169. hasher.addCharacters(testALChars, 2);
  170. hasher.addCharacters(testALChars + 2, 2);
  171. hasher.addCharacters(testALChars + 4);
  172. ASSERT_EQ(testAHash5, hasher.hash());
  173. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  174. hasher = StringHasher();
  175. hasher.addCharacters(testAUChars, 2);
  176. ASSERT_EQ(testAHash2, hasher.hash());
  177. ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  178. hasher.addCharacters(testAUChars + 2, 2);
  179. ASSERT_EQ(testAHash4, hasher.hash());
  180. ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  181. hasher.addCharacters(testAUChars + 4, 1);
  182. ASSERT_EQ(testAHash5, hasher.hash());
  183. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  184. hasher = StringHasher();
  185. hasher.addCharacters(testAUChars, 2);
  186. hasher.addCharacters(testAUChars + 2, 2);
  187. hasher.addCharacters(testAUChars + 4);
  188. ASSERT_EQ(testAHash5, hasher.hash());
  189. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  190. hasher = StringHasher();
  191. hasher.addCharacters(testBUChars, 2);
  192. ASSERT_EQ(testBHash2, hasher.hash());
  193. ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  194. hasher.addCharacters(testBUChars + 2, 2);
  195. ASSERT_EQ(testBHash4, hasher.hash());
  196. ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  197. hasher.addCharacters(testBUChars + 4, 1);
  198. ASSERT_EQ(testBHash5, hasher.hash());
  199. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  200. hasher = StringHasher();
  201. hasher.addCharacters(testBUChars, 2);
  202. hasher.addCharacters(testBUChars + 2, 2);
  203. hasher.addCharacters(testBUChars + 4);
  204. ASSERT_EQ(testBHash5, hasher.hash());
  205. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  206. // Hashing five characters, the first three, then the last two.
  207. hasher = StringHasher();
  208. hasher.addCharacters(testALChars, 3);
  209. ASSERT_EQ(testAHash3, hasher.hash());
  210. ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  211. hasher.addCharacters(testALChars + 3, 2);
  212. ASSERT_EQ(testAHash5, hasher.hash());
  213. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  214. hasher = StringHasher();
  215. hasher.addCharacters(testALChars, 3);
  216. ASSERT_EQ(testAHash3, hasher.hash());
  217. ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  218. hasher.addCharacters(testALChars + 3);
  219. ASSERT_EQ(testAHash5, hasher.hash());
  220. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  221. hasher = StringHasher();
  222. hasher.addCharacters(testAUChars, 3);
  223. ASSERT_EQ(testAHash3, hasher.hash());
  224. ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  225. hasher.addCharacters(testAUChars + 3, 2);
  226. ASSERT_EQ(testAHash5, hasher.hash());
  227. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  228. hasher = StringHasher();
  229. hasher.addCharacters(testAUChars, 3);
  230. ASSERT_EQ(testAHash3, hasher.hash());
  231. ASSERT_EQ(testAHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  232. hasher.addCharacters(testAUChars + 3, 2);
  233. ASSERT_EQ(testAHash5, hasher.hash());
  234. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  235. hasher = StringHasher();
  236. hasher.addCharacters(testBUChars, 3);
  237. ASSERT_EQ(testBHash3, hasher.hash());
  238. ASSERT_EQ(testBHash3 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  239. hasher.addCharacters(testBUChars + 3, 2);
  240. ASSERT_EQ(testBHash5, hasher.hash());
  241. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  242. hasher = StringHasher();
  243. hasher.addCharacters(testBUChars, 3);
  244. hasher.addCharacters(testBUChars + 3);
  245. ASSERT_EQ(testBHash5, hasher.hash());
  246. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  247. }
  248. TEST(WTF, StringHasher_addCharactersAssumingAligned)
  249. {
  250. StringHasher hasher;
  251. // Hashing zero characters.
  252. hasher = StringHasher();
  253. hasher.addCharactersAssumingAligned(static_cast<LChar*>(0), 0);
  254. ASSERT_EQ(emptyStringHash, hasher.hash());
  255. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  256. hasher = StringHasher();
  257. hasher.addCharactersAssumingAligned(nullLChars, 0);
  258. ASSERT_EQ(emptyStringHash, hasher.hash());
  259. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  260. hasher = StringHasher();
  261. hasher.addCharactersAssumingAligned(static_cast<UChar*>(0), 0);
  262. ASSERT_EQ(emptyStringHash, hasher.hash());
  263. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  264. hasher = StringHasher();
  265. hasher.addCharactersAssumingAligned(nullUChars, 0);
  266. ASSERT_EQ(emptyStringHash, hasher.hash());
  267. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  268. hasher = StringHasher();
  269. hasher.addCharactersAssumingAligned(nullUChars);
  270. ASSERT_EQ(emptyStringHash, hasher.hash());
  271. ASSERT_EQ(emptyStringHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  272. // Hashing one character.
  273. hasher = StringHasher();
  274. hasher.addCharactersAssumingAligned(nullLChars, 1);
  275. ASSERT_EQ(singleNullCharacterHash, hasher.hash());
  276. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  277. hasher = StringHasher();
  278. hasher.addCharactersAssumingAligned(nullUChars, 1);
  279. ASSERT_EQ(singleNullCharacterHash, hasher.hash());
  280. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  281. // Hashing five characters, all at once.
  282. hasher = StringHasher();
  283. hasher.addCharactersAssumingAligned(testALChars, 5);
  284. ASSERT_EQ(testAHash5, hasher.hash());
  285. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  286. hasher = StringHasher();
  287. hasher.addCharactersAssumingAligned(testALChars);
  288. ASSERT_EQ(testAHash5, hasher.hash());
  289. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  290. hasher = StringHasher();
  291. hasher.addCharactersAssumingAligned(testAUChars, 5);
  292. ASSERT_EQ(testAHash5, hasher.hash());
  293. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  294. hasher = StringHasher();
  295. hasher.addCharactersAssumingAligned(testAUChars);
  296. ASSERT_EQ(testAHash5, hasher.hash());
  297. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  298. hasher = StringHasher();
  299. hasher.addCharactersAssumingAligned(testBUChars, 5);
  300. ASSERT_EQ(testBHash5, hasher.hash());
  301. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  302. hasher = StringHasher();
  303. hasher.addCharactersAssumingAligned(testBUChars);
  304. ASSERT_EQ(testBHash5, hasher.hash());
  305. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  306. // Hashing five characters, in groups of two, then the last one.
  307. hasher = StringHasher();
  308. hasher.addCharactersAssumingAligned(testALChars, 2);
  309. ASSERT_EQ(testAHash2, hasher.hash());
  310. ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  311. hasher.addCharactersAssumingAligned(testALChars + 2, 2);
  312. ASSERT_EQ(testAHash4, hasher.hash());
  313. ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  314. hasher.addCharactersAssumingAligned(testALChars + 4, 1);
  315. ASSERT_EQ(testAHash5, hasher.hash());
  316. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  317. hasher = StringHasher();
  318. hasher.addCharactersAssumingAligned(testALChars, 2);
  319. hasher.addCharactersAssumingAligned(testALChars + 2, 2);
  320. hasher.addCharactersAssumingAligned(testALChars + 4);
  321. ASSERT_EQ(testAHash5, hasher.hash());
  322. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  323. hasher = StringHasher();
  324. hasher.addCharactersAssumingAligned(testAUChars, 2);
  325. ASSERT_EQ(testAHash2, hasher.hash());
  326. ASSERT_EQ(testAHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  327. hasher.addCharactersAssumingAligned(testAUChars + 2, 2);
  328. ASSERT_EQ(testAHash4, hasher.hash());
  329. ASSERT_EQ(testAHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  330. hasher.addCharactersAssumingAligned(testAUChars + 4, 1);
  331. ASSERT_EQ(testAHash5, hasher.hash());
  332. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  333. hasher = StringHasher();
  334. hasher.addCharactersAssumingAligned(testAUChars, 2);
  335. hasher.addCharactersAssumingAligned(testAUChars + 2, 2);
  336. hasher.addCharactersAssumingAligned(testAUChars + 4);
  337. ASSERT_EQ(testAHash5, hasher.hash());
  338. ASSERT_EQ(testAHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  339. hasher = StringHasher();
  340. hasher.addCharactersAssumingAligned(testBUChars, 2);
  341. ASSERT_EQ(testBHash2, hasher.hash());
  342. ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  343. hasher.addCharactersAssumingAligned(testBUChars + 2, 2);
  344. ASSERT_EQ(testBHash4, hasher.hash());
  345. ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  346. hasher.addCharactersAssumingAligned(testBUChars + 4, 1);
  347. ASSERT_EQ(testBHash5, hasher.hash());
  348. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  349. hasher = StringHasher();
  350. hasher.addCharactersAssumingAligned(testBUChars, 2);
  351. hasher.addCharactersAssumingAligned(testBUChars + 2, 2);
  352. hasher.addCharactersAssumingAligned(testBUChars + 4);
  353. ASSERT_EQ(testBHash5, hasher.hash());
  354. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  355. // Hashing five characters, first two characters one at a time,
  356. // then two more, then the last one.
  357. hasher = StringHasher();
  358. hasher.addCharacter(testBUChars[0]);
  359. ASSERT_EQ(testBHash1, hasher.hash());
  360. ASSERT_EQ(testBHash1 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  361. hasher.addCharacter(testBUChars[1]);
  362. ASSERT_EQ(testBHash2, hasher.hash());
  363. ASSERT_EQ(testBHash2 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  364. hasher.addCharactersAssumingAligned(testBUChars[2], testBUChars[3]);
  365. ASSERT_EQ(testBHash4, hasher.hash());
  366. ASSERT_EQ(testBHash4 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  367. hasher.addCharactersAssumingAligned(testBUChars + 4);
  368. ASSERT_EQ(testBHash5, hasher.hash());
  369. ASSERT_EQ(testBHash5 & 0xFFFFFF, hasher.hashWithTop8BitsMasked());
  370. }
  371. TEST(WTF, StringHasher_computeHash)
  372. {
  373. ASSERT_EQ(emptyStringHash, StringHasher::computeHash(static_cast<LChar*>(0), 0));
  374. ASSERT_EQ(emptyStringHash, StringHasher::computeHash(nullLChars, 0));
  375. ASSERT_EQ(emptyStringHash, StringHasher::computeHash(static_cast<UChar*>(0), 0));
  376. ASSERT_EQ(emptyStringHash, StringHasher::computeHash(nullUChars, 0));
  377. ASSERT_EQ(singleNullCharacterHash, StringHasher::computeHash(nullLChars, 1));
  378. ASSERT_EQ(singleNullCharacterHash, StringHasher::computeHash(nullUChars, 1));
  379. ASSERT_EQ(testAHash5, StringHasher::computeHash(testALChars, 5));
  380. ASSERT_EQ(testAHash5, StringHasher::computeHash(testAUChars, 5));
  381. ASSERT_EQ(testBHash5, StringHasher::computeHash(testBUChars, 5));
  382. }
  383. TEST(WTF, StringHasher_computeHashAndMaskTop8Bits)
  384. {
  385. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(static_cast<LChar*>(0), 0));
  386. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullLChars, 0));
  387. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(static_cast<UChar*>(0), 0));
  388. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullUChars, 0));
  389. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullLChars, 1));
  390. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(nullUChars, 1));
  391. ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(testALChars, 5));
  392. ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(testAUChars, 5));
  393. ASSERT_EQ(testBHash5 & 0xFFFFFF, StringHasher::computeHashAndMaskTop8Bits(testBUChars, 5));
  394. }
  395. TEST(WTF, StringHasher_hashMemory)
  396. {
  397. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory(0, 0));
  398. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory(nullUChars, 0));
  399. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory<0>(0));
  400. ASSERT_EQ(emptyStringHash & 0xFFFFFF, StringHasher::hashMemory<0>(nullUChars));
  401. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::hashMemory(nullUChars, 2));
  402. ASSERT_EQ(singleNullCharacterHash & 0xFFFFFF, StringHasher::hashMemory<2>(nullUChars));
  403. ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::hashMemory(testAUChars, 10));
  404. ASSERT_EQ(testAHash5 & 0xFFFFFF, StringHasher::hashMemory<10>(testAUChars));
  405. ASSERT_EQ(testBHash5 & 0xFFFFFF, StringHasher::hashMemory(testBUChars, 10));
  406. ASSERT_EQ(testBHash5 & 0xFFFFFF, StringHasher::hashMemory<10>(testBUChars));
  407. }
  408. } // namespace TestWebKitAPI