City.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. // Copyright (c) 2011 Google, Inc.
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy
  4. // of this software and associated documentation files (the "Software"), to deal
  5. // in the Software without restriction, including without limitation the rights
  6. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. // copies of the Software, and to permit persons to whom the Software is
  8. // furnished to do so, subject to the following conditions:
  9. //
  10. // The above copyright notice and this permission notice shall be included in
  11. // all copies or substantial portions of the Software.
  12. //
  13. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19. // THE SOFTWARE.
  20. //
  21. // CityHash, by Geoff Pike and Jyrki Alakuijala
  22. //
  23. // This file provides CityHash64() and related functions.
  24. //
  25. // It's probably possible to create even faster hash functions by
  26. // writing a program that systematically explores some of the space of
  27. // possible hash functions, by using SIMD instructions, or by
  28. // compromising on hash quality.
  29. #include "City.h"
  30. #include <algorithm>
  31. #include <string.h> // for memcpy and memset
  32. using namespace std;
  33. static uint64 UNALIGNED_LOAD64(const char *p) {
  34. uint64 result;
  35. memcpy(&result, p, sizeof(result));
  36. return result;
  37. }
  38. static uint32 UNALIGNED_LOAD32(const char *p) {
  39. uint32 result;
  40. memcpy(&result, p, sizeof(result));
  41. return result;
  42. }
  43. #ifdef _MSC_VER
  44. #include <stdlib.h>
  45. #define bswap_32(x) _byteswap_ulong(x)
  46. #define bswap_64(x) _byteswap_uint64(x)
  47. #elif defined(__APPLE__)
  48. // Mac OS X / Darwin features
  49. #include <libkern/OSByteOrder.h>
  50. #define bswap_32(x) OSSwapInt32(x)
  51. #define bswap_64(x) OSSwapInt64(x)
  52. #elif defined(__FreeBSD__)
  53. // FreeBSD byteswap functinos
  54. #include <sys/endian.h>
  55. #define bswap_32(x) bswap32(x)
  56. #define bswap_64(x) bswap64(x)
  57. #else
  58. #include <byteswap.h>
  59. #endif
  60. #ifndef __BIG_ENDIAN__
  61. #define uint32_in_expected_order(x) (x)
  62. #define uint64_in_expected_order(x) (x)
  63. #else
  64. #define uint32_in_expected_order(x) (bswap_32(x))
  65. #define uint64_in_expected_order(x) (bswap_64(x))
  66. #endif // __BIG_ENDIAN__
  67. #if !defined(LIKELY)
  68. #if defined(__GNUC__) || defined(__INTEL_COMPILER)
  69. #define LIKELY(x) (__builtin_expect(!!(x), 1))
  70. #else
  71. #define LIKELY(x) (x)
  72. #endif
  73. #endif
  74. static uint64 Fetch64(const char *p) {
  75. return uint64_in_expected_order(UNALIGNED_LOAD64(p));
  76. }
  77. static uint32 Fetch32(const char *p) {
  78. return uint32_in_expected_order(UNALIGNED_LOAD32(p));
  79. }
  80. // Some primes between 2^63 and 2^64 for various uses.
  81. static const uint64 k0 = 0xc3a5c85c97cb3127ULL;
  82. static const uint64 k1 = 0xb492b66fbe98f273ULL;
  83. static const uint64 k2 = 0x9ae16a3b2f90404fULL;
  84. static const uint64 k3 = 0xc949d7c7509e6557ULL;
  85. // Magic numbers for 32-bit hashing. Copied from Murmur3.
  86. static const uint32_t c1 = 0xcc9e2d51;
  87. static const uint32_t c2 = 0x1b873593;
  88. // A 32-bit to 32-bit integer hash copied from Murmur3.
  89. static uint32 fmix(uint32 h)
  90. {
  91. h ^= h >> 16;
  92. h *= 0x85ebca6b;
  93. h ^= h >> 13;
  94. h *= 0xc2b2ae35;
  95. h ^= h >> 16;
  96. return h;
  97. }
  98. static uint32 Rotate32(uint32 val, int shift) {
  99. // Avoid shifting by 32: doing so yields an undefined result.
  100. return shift == 0 ? val : ((val >> shift) | (val << (32 - shift)));
  101. }
  102. #undef PERMUTE3
  103. #define PERMUTE3(a, b, c) do { std::swap(a, b); std::swap(a, c); } while (0)
  104. static uint32 Mur(uint32 a, uint32 h) {
  105. // Helper from Murmur3 for combining two 32-bit values.
  106. a *= c1;
  107. a = Rotate32(a, 17);
  108. a *= c2;
  109. h ^= a;
  110. h = Rotate32(h, 19);
  111. return h * 5 + 0xe6546b64;
  112. }
  113. static uint32 Hash32Len13to24(const char *s, size_t len, uint32 seed) {
  114. uint32 a = Fetch32(s - 4 + (len >> 1));
  115. uint32 b = Fetch32(s + 4);
  116. uint32 c = Fetch32(s + len - 8);
  117. uint32 d = Fetch32(s + (len >> 1));
  118. uint32 e = Fetch32(s);
  119. uint32 f = Fetch32(s + len - 4);
  120. uint32 h = seed + len;
  121. return fmix(Mur(f, Mur(e, Mur(d, Mur(c, Mur(b, Mur(a, h)))))));
  122. }
  123. static uint32 Hash32Len0to4(const char *s, size_t len, uint32 seed) {
  124. uint32 b = seed;
  125. uint32 c = 9;
  126. for (int i = 0; i < len; i++) {
  127. b = b * c1 + s[i];
  128. c ^= b;
  129. }
  130. return fmix(Mur(b, Mur(len, c)));
  131. }
  132. static uint32 Hash32Len5to12(const char *s, size_t len, uint32 seed) {
  133. uint32 a = len + seed, b = len * 5, c = 9, d = b;
  134. a += Fetch32(s);
  135. b += Fetch32(s + len - 4);
  136. c += Fetch32(s + ((len >> 1) & 4));
  137. return fmix(Mur(c, Mur(b, Mur(a, d))));
  138. }
  139. uint32 CityHash32WithSeed(const char *s, size_t len, uint32 seed) {
  140. if (len <= 24) {
  141. return len <= 12 ?
  142. (len <= 4 ? Hash32Len0to4(s, len, seed) : Hash32Len5to12(s, len, seed)) :
  143. Hash32Len13to24(s, len, seed);
  144. }
  145. // len > 24
  146. uint32 h = len + seed, g = c1 * len, f = g;
  147. uint32 a0 = Rotate32(Fetch32(s + len - 4) * c1, 17) * c2;
  148. uint32 a1 = Rotate32(Fetch32(s + len - 8) * c1, 17) * c2;
  149. uint32 a2 = Rotate32(Fetch32(s + len - 16) * c1, 17) * c2;
  150. uint32 a3 = Rotate32(Fetch32(s + len - 12) * c1, 17) * c2;
  151. uint32 a4 = Rotate32(Fetch32(s + len - 20) * c1, 17) * c2;
  152. h ^= a0;
  153. h = Rotate32(h, 19);
  154. h = h * 5 + 0xe6546b64;
  155. h ^= a2;
  156. h = Rotate32(h, 19);
  157. h = h * 5 + 0xe6546b64;
  158. g ^= a1;
  159. g = Rotate32(g, 19);
  160. g = g * 5 + 0xe6546b64;
  161. g ^= a3;
  162. g = Rotate32(g, 19);
  163. g = g * 5 + 0xe6546b64;
  164. f += a4;
  165. f = Rotate32(f, 19);
  166. f = f * 5 + 0xe6546b64;
  167. size_t iters = (len - 1) / 20;
  168. do {
  169. uint32 a0 = Rotate32(Fetch32(s) * c1, 17) * c2;
  170. uint32 a1 = Fetch32(s + 4);
  171. uint32 a2 = Rotate32(Fetch32(s + 8) * c1, 17) * c2;
  172. uint32 a3 = Rotate32(Fetch32(s + 12) * c1, 17) * c2;
  173. uint32 a4 = Fetch32(s + 16);
  174. h ^= a0;
  175. h = Rotate32(h, 18);
  176. h = h * 5 + 0xe6546b64;
  177. f += a1;
  178. f = Rotate32(f, 19);
  179. f = f * c1;
  180. g += a2;
  181. g = Rotate32(g, 18);
  182. g = g * 5 + 0xe6546b64;
  183. h ^= a3 + a1;
  184. h = Rotate32(h, 19);
  185. h = h * 5 + 0xe6546b64;
  186. g ^= a4;
  187. g = bswap_32(g) * 5;
  188. h += a4 * 5;
  189. h = bswap_32(h);
  190. f += a0;
  191. PERMUTE3(f, h, g);
  192. s += 20;
  193. } while (--iters != 0);
  194. g = Rotate32(g, 11) * c1;
  195. g = Rotate32(g, 17) * c1;
  196. f = Rotate32(f, 11) * c1;
  197. f = Rotate32(f, 17) * c1;
  198. h = Rotate32(h + g, 19);
  199. h = h * 5 + 0xe6546b64;
  200. h = Rotate32(h, 17) * c1;
  201. h = Rotate32(h + f, 19);
  202. h = h * 5 + 0xe6546b64;
  203. h = Rotate32(h, 17) * c1;
  204. return h;
  205. }
  206. // Bitwise right rotate. Normally this will compile to a single
  207. // instruction, especially if the shift is a manifest constant.
  208. static uint64 Rotate(uint64 val, int shift) {
  209. // Avoid shifting by 64: doing so yields an undefined result.
  210. return shift == 0 ? val : ((val >> shift) | (val << (64 - shift)));
  211. }
  212. // Equivalent to Rotate(), but requires the second arg to be non-zero.
  213. // On x86-64, and probably others, it's possible for this to compile
  214. // to a single instruction if both args are already in registers.
  215. static uint64 RotateByAtLeast1(uint64 val, int shift) {
  216. return (val >> shift) | (val << (64 - shift));
  217. }
  218. static uint64 ShiftMix(uint64 val) {
  219. return val ^ (val >> 47);
  220. }
  221. static uint64 HashLen16(uint64 u, uint64 v) {
  222. return Hash128to64(uint128(u, v));
  223. }
  224. static uint64 HashLen0to16(const char *s, size_t len) {
  225. if (len > 8) {
  226. uint64 a = Fetch64(s);
  227. uint64 b = Fetch64(s + len - 8);
  228. return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b;
  229. }
  230. if (len >= 4) {
  231. uint64 a = Fetch32(s);
  232. return HashLen16(len + (a << 3), Fetch32(s + len - 4));
  233. }
  234. if (len > 0) {
  235. uint8 a = s[0];
  236. uint8 b = s[len >> 1];
  237. uint8 c = s[len - 1];
  238. uint32 y = static_cast<uint32>(a) + (static_cast<uint32>(b) << 8);
  239. uint32 z = len + (static_cast<uint32>(c) << 2);
  240. return ShiftMix(y * k2 ^ z * k3) * k2;
  241. }
  242. return k2;
  243. }
  244. // This probably works well for 16-byte strings as well, but it may be overkill
  245. // in that case.
  246. static uint64 HashLen17to32(const char *s, size_t len) {
  247. uint64 a = Fetch64(s) * k1;
  248. uint64 b = Fetch64(s + 8);
  249. uint64 c = Fetch64(s + len - 8) * k2;
  250. uint64 d = Fetch64(s + len - 16) * k0;
  251. return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d,
  252. a + Rotate(b ^ k3, 20) - c + len);
  253. }
  254. // Return a 16-byte hash for 48 bytes. Quick and dirty.
  255. // Callers do best to use "random-looking" values for a and b.
  256. static pair<uint64, uint64> WeakHashLen32WithSeeds(
  257. uint64 w, uint64 x, uint64 y, uint64 z, uint64 a, uint64 b) {
  258. a += w;
  259. b = Rotate(b + a + z, 21);
  260. uint64 c = a;
  261. a += x;
  262. a += y;
  263. b += Rotate(a, 44);
  264. return make_pair(a + z, b + c);
  265. }
  266. // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
  267. static pair<uint64, uint64> WeakHashLen32WithSeeds(
  268. const char* s, uint64 a, uint64 b) {
  269. return WeakHashLen32WithSeeds(Fetch64(s),
  270. Fetch64(s + 8),
  271. Fetch64(s + 16),
  272. Fetch64(s + 24),
  273. a,
  274. b);
  275. }
  276. // Return an 8-byte hash for 33 to 64 bytes.
  277. static uint64 HashLen33to64(const char *s, size_t len) {
  278. uint64 z = Fetch64(s + 24);
  279. uint64 a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0;
  280. uint64 b = Rotate(a + z, 52);
  281. uint64 c = Rotate(a, 37);
  282. a += Fetch64(s + 8);
  283. c += Rotate(a, 7);
  284. a += Fetch64(s + 16);
  285. uint64 vf = a + z;
  286. uint64 vs = b + Rotate(a, 31) + c;
  287. a = Fetch64(s + 16) + Fetch64(s + len - 32);
  288. z = Fetch64(s + len - 8);
  289. b = Rotate(a + z, 52);
  290. c = Rotate(a, 37);
  291. a += Fetch64(s + len - 24);
  292. c += Rotate(a, 7);
  293. a += Fetch64(s + len - 16);
  294. uint64 wf = a + z;
  295. uint64 ws = b + Rotate(a, 31) + c;
  296. uint64 r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0);
  297. return ShiftMix(r * k0 + vs) * k2;
  298. }
  299. uint64 CityHash64(const char *s, size_t len) {
  300. if (len <= 32) {
  301. if (len <= 16) {
  302. return HashLen0to16(s, len);
  303. } else {
  304. return HashLen17to32(s, len);
  305. }
  306. } else if (len <= 64) {
  307. return HashLen33to64(s, len);
  308. }
  309. // For strings over 64 bytes we hash the end first, and then as we
  310. // loop we keep 56 bytes of state: v, w, x, y, and z.
  311. uint64 x = Fetch64(s + len - 40);
  312. uint64 y = Fetch64(s + len - 16) + Fetch64(s + len - 56);
  313. uint64 z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24));
  314. pair<uint64, uint64> v = WeakHashLen32WithSeeds(s + len - 64, len, z);
  315. pair<uint64, uint64> w = WeakHashLen32WithSeeds(s + len - 32, y + k1, x);
  316. x = x * k1 + Fetch64(s);
  317. // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks.
  318. len = (len - 1) & ~static_cast<size_t>(63);
  319. do {
  320. x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1;
  321. y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1;
  322. x ^= w.second;
  323. y += v.first + Fetch64(s + 40);
  324. z = Rotate(z + w.first, 33) * k1;
  325. v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
  326. w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16));
  327. std::swap(z, x);
  328. s += 64;
  329. len -= 64;
  330. } while (len != 0);
  331. return HashLen16(HashLen16(v.first, w.first) + ShiftMix(y) * k1 + z,
  332. HashLen16(v.second, w.second) + x);
  333. }
  334. uint64 CityHash64WithSeed(const char *s, size_t len, uint64 seed) {
  335. return CityHash64WithSeeds(s, len, k2, seed);
  336. }
  337. uint64 CityHash64WithSeeds(const char *s, size_t len,
  338. uint64 seed0, uint64 seed1) {
  339. return HashLen16(CityHash64(s, len) - seed0, seed1);
  340. }
  341. // A subroutine for CityHash128(). Returns a decent 128-bit hash for strings
  342. // of any length representable in signed long. Based on City and Murmur.
  343. static uint128 CityMurmur(const char *s, size_t len, uint128 seed) {
  344. uint64 a = Uint128Low64(seed);
  345. uint64 b = Uint128High64(seed);
  346. uint64 c = 0;
  347. uint64 d = 0;
  348. signed long l = len - 16;
  349. if (l <= 0) { // len <= 16
  350. a = ShiftMix(a * k1) * k1;
  351. c = b * k1 + HashLen0to16(s, len);
  352. d = ShiftMix(a + (len >= 8 ? Fetch64(s) : c));
  353. } else { // len > 16
  354. c = HashLen16(Fetch64(s + len - 8) + k1, a);
  355. d = HashLen16(b + len, c + Fetch64(s + len - 16));
  356. a += d;
  357. do {
  358. a ^= ShiftMix(Fetch64(s) * k1) * k1;
  359. a *= k1;
  360. b ^= a;
  361. c ^= ShiftMix(Fetch64(s + 8) * k1) * k1;
  362. c *= k1;
  363. d ^= c;
  364. s += 16;
  365. l -= 16;
  366. } while (l > 0);
  367. }
  368. a = HashLen16(a, c);
  369. b = HashLen16(d, b);
  370. return uint128(a ^ b, HashLen16(b, a));
  371. }
  372. uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed) {
  373. if (len < 128) {
  374. return CityMurmur(s, len, seed);
  375. }
  376. // We expect len >= 128 to be the common case. Keep 56 bytes of state:
  377. // v, w, x, y, and z.
  378. pair<uint64, uint64> v, w;
  379. uint64 x = Uint128Low64(seed);
  380. uint64 y = Uint128High64(seed);
  381. uint64 z = len * k1;
  382. v.first = Rotate(y ^ k1, 49) * k1 + Fetch64(s);
  383. v.second = Rotate(v.first, 42) * k1 + Fetch64(s + 8);
  384. w.first = Rotate(y + z, 35) * k1 + x;
  385. w.second = Rotate(x + Fetch64(s + 88), 53) * k1;
  386. // This is the same inner loop as CityHash64(), manually unrolled.
  387. do {
  388. x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1;
  389. y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1;
  390. x ^= w.second;
  391. y += v.first + Fetch64(s + 40);
  392. z = Rotate(z + w.first, 33) * k1;
  393. v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
  394. w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16));
  395. std::swap(z, x);
  396. s += 64;
  397. x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1;
  398. y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1;
  399. x ^= w.second;
  400. y += v.first + Fetch64(s + 40);
  401. z = Rotate(z + w.first, 33) * k1;
  402. v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
  403. w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16));
  404. std::swap(z, x);
  405. s += 64;
  406. len -= 128;
  407. } while (LIKELY(len >= 128));
  408. x += Rotate(v.first + z, 49) * k0;
  409. z += Rotate(w.first, 37) * k0;
  410. // If 0 < len < 128, hash up to 4 chunks of 32 bytes each from the end of s.
  411. for (size_t tail_done = 0; tail_done < len; ) {
  412. tail_done += 32;
  413. y = Rotate(x + y, 42) * k0 + v.second;
  414. w.first += Fetch64(s + len - tail_done + 16);
  415. x = x * k0 + w.first;
  416. z += w.second + Fetch64(s + len - tail_done);
  417. w.second += v.first;
  418. v = WeakHashLen32WithSeeds(s + len - tail_done, v.first + z, v.second);
  419. }
  420. // At this point our 56 bytes of state should contain more than
  421. // enough information for a strong 128-bit hash. We use two
  422. // different 56-byte-to-8-byte hashes to get a 16-byte final result.
  423. x = HashLen16(x, v.first);
  424. y = HashLen16(y + z, w.first);
  425. return uint128(HashLen16(x + v.second, w.second) + y,
  426. HashLen16(x + w.second, y + v.second));
  427. }
  428. uint128 CityHash128(const char *s, size_t len) {
  429. if (len >= 16) {
  430. return CityHash128WithSeed(s + 16,
  431. len - 16,
  432. uint128(Fetch64(s) ^ k3,
  433. Fetch64(s + 8)));
  434. } else if (len >= 8) {
  435. return CityHash128WithSeed(NULL,
  436. 0,
  437. uint128(Fetch64(s) ^ (len * k0),
  438. Fetch64(s + len - 8) ^ k1));
  439. } else {
  440. return CityHash128WithSeed(s, len, uint128(k0, k1));
  441. }
  442. }
  443. #if defined(__SSE4_2__) && defined(__x86_64__)
  444. #include <nmmintrin.h>
  445. // Requires len >= 240.
  446. static void CityHashCrc256Long(const char *s, size_t len,
  447. uint32 seed, uint64 *result) {
  448. uint64 a = Fetch64(s + 56) + k0;
  449. uint64 b = Fetch64(s + 96) + k0;
  450. uint64 c = result[0] = HashLen16(b, len);
  451. uint64 d = result[1] = Fetch64(s + 120) * k0 + len;
  452. uint64 e = Fetch64(s + 184) + seed;
  453. uint64 f = seed;
  454. uint64 g = 0;
  455. uint64 h = 0;
  456. uint64 i = 0;
  457. uint64 j = 0;
  458. uint64 t = c + d;
  459. // 240 bytes of input per iter.
  460. size_t iters = len / 240;
  461. len -= iters * 240;
  462. do {
  463. #define CHUNK(multiplier, z) \
  464. { \
  465. uint64 old_a = a; \
  466. a = Rotate(b, 41 ^ z) * multiplier + Fetch64(s); \
  467. b = Rotate(c, 27 ^ z) * multiplier + Fetch64(s + 8); \
  468. c = Rotate(d, 41 ^ z) * multiplier + Fetch64(s + 16); \
  469. d = Rotate(e, 33 ^ z) * multiplier + Fetch64(s + 24); \
  470. e = Rotate(t, 25 ^ z) * multiplier + Fetch64(s + 32); \
  471. t = old_a; \
  472. } \
  473. f = _mm_crc32_u64(f, a); \
  474. g = _mm_crc32_u64(g, b); \
  475. h = _mm_crc32_u64(h, c); \
  476. i = _mm_crc32_u64(i, d); \
  477. j = _mm_crc32_u64(j, e); \
  478. s += 40
  479. CHUNK(1, 1); CHUNK(k0, 0);
  480. CHUNK(1, 1); CHUNK(k0, 0);
  481. CHUNK(1, 1); CHUNK(k0, 0);
  482. } while (--iters > 0);
  483. while (len >= 40) {
  484. CHUNK(k0, 0);
  485. len -= 40;
  486. }
  487. if (len > 0) {
  488. s = s + len - 40;
  489. CHUNK(k0, 0);
  490. }
  491. j += i << 32;
  492. a = HashLen16(a, j);
  493. h += g << 32;
  494. b += h;
  495. c = HashLen16(c, f) + i;
  496. d = HashLen16(d, e + result[0]);
  497. j += e;
  498. i += HashLen16(h, t);
  499. e = HashLen16(a, d) + j;
  500. f = HashLen16(b, c) + a;
  501. g = HashLen16(j, i) + c;
  502. result[0] = e + f + g + h;
  503. a = ShiftMix((a + g) * k0) * k0 + b;
  504. result[1] += a + result[0];
  505. a = ShiftMix(a * k0) * k0 + c;
  506. result[2] = a + result[1];
  507. a = ShiftMix((a + e) * k0) * k0;
  508. result[3] = a + result[2];
  509. }
  510. // Requires len < 240.
  511. static void CityHashCrc256Short(const char *s, size_t len, uint64 *result) {
  512. char buf[240];
  513. memcpy(buf, s, len);
  514. memset(buf + len, 0, 240 - len);
  515. CityHashCrc256Long(buf, 240, ~static_cast<uint32>(len), result);
  516. }
  517. void CityHashCrc256(const char *s, size_t len, uint64 *result) {
  518. if (LIKELY(len >= 240)) {
  519. CityHashCrc256Long(s, len, 0, result);
  520. } else {
  521. CityHashCrc256Short(s, len, result);
  522. }
  523. }
  524. uint128 CityHashCrc128WithSeed(const char *s, size_t len, uint128 seed) {
  525. if (len <= 900) {
  526. return CityHash128WithSeed(s, len, seed);
  527. } else {
  528. uint64 result[4];
  529. CityHashCrc256(s, len, result);
  530. uint64 u = Uint128High64(seed) + result[0];
  531. uint64 v = Uint128Low64(seed) + result[1];
  532. return uint128(HashLen16(u, v + result[2]),
  533. HashLen16(Rotate(v, 32), u * k0 + result[3]));
  534. }
  535. }
  536. uint128 CityHashCrc128(const char *s, size_t len) {
  537. if (len <= 900) {
  538. return CityHash128(s, len);
  539. } else {
  540. uint64 result[4];
  541. CityHashCrc256(s, len, result);
  542. return uint128(result[2], result[3]);
  543. }
  544. }
  545. #endif