city.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  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 "config.h"
  30. #include "city.h"
  31. #if CDS_BUILD_BITS == 64
  32. #include <algorithm>
  33. #include <string.h> // for memcpy and memset
  34. using namespace std;
  35. static uint64 UNALIGNED_LOAD64(const char *p) {
  36. uint64 result;
  37. memcpy(&result, p, sizeof(result));
  38. return result;
  39. }
  40. static uint32 UNALIGNED_LOAD32(const char *p) {
  41. uint32 result;
  42. memcpy(&result, p, sizeof(result));
  43. return result;
  44. }
  45. #ifdef _MSC_VER
  46. #include <stdlib.h>
  47. #define bswap_32(x) _byteswap_ulong(x)
  48. #define bswap_64(x) _byteswap_uint64(x)
  49. #elif defined(__APPLE__)
  50. // Mac OS X / Darwin features
  51. #include <libkern/OSByteOrder.h>
  52. #define bswap_32(x) OSSwapInt32(x)
  53. #define bswap_64(x) OSSwapInt64(x)
  54. #elif defined(__NetBSD__)
  55. #include <sys/types.h>
  56. #include <machine/bswap.h>
  57. #if defined(__BSWAP_RENAME) && !defined(__bswap_32)
  58. #define bswap_32(x) bswap32(x)
  59. #define bswap_64(x) bswap64(x)
  60. #endif
  61. #else
  62. #include <cds_test/ext_byteswap.h>
  63. #endif
  64. #ifdef WORDS_BIGENDIAN
  65. #define uint32_in_expected_order(x) (bswap_32(x))
  66. #define uint64_in_expected_order(x) (bswap_64(x))
  67. #else
  68. #define uint32_in_expected_order(x) (x)
  69. #define uint64_in_expected_order(x) (x)
  70. #endif
  71. #if !defined(LIKELY)
  72. #if HAVE_BUILTIN_EXPECT
  73. #define LIKELY(x) (__builtin_expect(!!(x), 1))
  74. #else
  75. #define LIKELY(x) (x)
  76. #endif
  77. #endif
  78. static uint64 Fetch64(const char *p) {
  79. return uint64_in_expected_order(UNALIGNED_LOAD64(p));
  80. }
  81. static uint32 Fetch32(const char *p) {
  82. return uint32_in_expected_order(UNALIGNED_LOAD32(p));
  83. }
  84. // Some primes between 2^63 and 2^64 for various uses.
  85. static const uint64 k0 = 0xc3a5c85c97cb3127ULL;
  86. static const uint64 k1 = 0xb492b66fbe98f273ULL;
  87. static const uint64 k2 = 0x9ae16a3b2f90404fULL;
  88. // Magic numbers for 32-bit hashing. Copied from Murmur3.
  89. static const uint32_t c1 = 0xcc9e2d51;
  90. static const uint32_t c2 = 0x1b873593;
  91. // A 32-bit to 32-bit integer hash copied from Murmur3.
  92. static uint32 fmix(uint32 h)
  93. {
  94. h ^= h >> 16;
  95. h *= 0x85ebca6b;
  96. h ^= h >> 13;
  97. h *= 0xc2b2ae35;
  98. h ^= h >> 16;
  99. return h;
  100. }
  101. static uint32 Rotate32(uint32 val, int shift) {
  102. // Avoid shifting by 32: doing so yields an undefined result.
  103. return shift == 0 ? val : ((val >> shift) | (val << (32 - shift)));
  104. }
  105. #undef PERMUTE3
  106. #define PERMUTE3(a, b, c) do { std::swap(a, b); std::swap(a, c); } while (0)
  107. static uint32 Mur(uint32 a, uint32 h) {
  108. // Helper from Murmur3 for combining two 32-bit values.
  109. a *= c1;
  110. a = Rotate32(a, 17);
  111. a *= c2;
  112. h ^= a;
  113. h = Rotate32(h, 19);
  114. return h * 5 + 0xe6546b64;
  115. }
  116. static uint32 Hash32Len13to24(const char *s, size_t len) {
  117. uint32 a = Fetch32(s - 4 + (len >> 1));
  118. uint32 b = Fetch32(s + 4);
  119. uint32 c = Fetch32(s + len - 8);
  120. uint32 d = Fetch32(s + (len >> 1));
  121. uint32 e = Fetch32(s);
  122. uint32 f = Fetch32(s + len - 4);
  123. uint32 h = static_cast<uint32>( len );
  124. return fmix(Mur(f, Mur(e, Mur(d, Mur(c, Mur(b, Mur(a, h)))))));
  125. }
  126. static uint32 Hash32Len0to4(const char *s, size_t len) {
  127. uint32 b = 0;
  128. uint32 c = 9;
  129. for (size_t i = 0; i < len; i++) {
  130. signed char v = s[i];
  131. b = b * c1 + v;
  132. c ^= b;
  133. }
  134. return fmix(Mur(b, Mur(static_cast<uint32>( len ), c)));
  135. }
  136. static uint32 Hash32Len5to12(const char *s, size_t len) {
  137. uint32 a = static_cast<uint32>( len ), b = static_cast<uint32>( len ) * 5, c = 9, d = b;
  138. a += Fetch32(s);
  139. b += Fetch32(s + len - 4);
  140. c += Fetch32(s + ((len >> 1) & 4));
  141. return fmix(Mur(c, Mur(b, Mur(a, d))));
  142. }
  143. uint32 CityHash32(const char *s, size_t len) {
  144. if (len <= 24) {
  145. return len <= 12 ?
  146. (len <= 4 ? Hash32Len0to4(s, len) : Hash32Len5to12(s, len)) :
  147. Hash32Len13to24(s, len);
  148. }
  149. // len > 24
  150. uint32 h = static_cast<uint32>( len ), g = static_cast<uint32>( c1 * len ), f = g;
  151. uint32 a0 = Rotate32(Fetch32(s + len - 4) * c1, 17) * c2;
  152. uint32 a1 = Rotate32(Fetch32(s + len - 8) * c1, 17) * c2;
  153. uint32 a2 = Rotate32(Fetch32(s + len - 16) * c1, 17) * c2;
  154. uint32 a3 = Rotate32(Fetch32(s + len - 12) * c1, 17) * c2;
  155. uint32 a4 = Rotate32(Fetch32(s + len - 20) * c1, 17) * c2;
  156. h ^= a0;
  157. h = Rotate32(h, 19);
  158. h = h * 5 + 0xe6546b64;
  159. h ^= a2;
  160. h = Rotate32(h, 19);
  161. h = h * 5 + 0xe6546b64;
  162. g ^= a1;
  163. g = Rotate32(g, 19);
  164. g = g * 5 + 0xe6546b64;
  165. g ^= a3;
  166. g = Rotate32(g, 19);
  167. g = g * 5 + 0xe6546b64;
  168. f += a4;
  169. f = Rotate32(f, 19);
  170. f = f * 5 + 0xe6546b64;
  171. size_t iters = (len - 1) / 20;
  172. do {
  173. a0 = Rotate32(Fetch32(s) * c1, 17) * c2;
  174. a1 = Fetch32(s + 4);
  175. a2 = Rotate32(Fetch32(s + 8) * c1, 17) * c2;
  176. a3 = Rotate32(Fetch32(s + 12) * c1, 17) * c2;
  177. a4 = Fetch32(s + 16);
  178. h ^= a0;
  179. h = Rotate32(h, 18);
  180. h = h * 5 + 0xe6546b64;
  181. f += a1;
  182. f = Rotate32(f, 19);
  183. f = f * c1;
  184. g += a2;
  185. g = Rotate32(g, 18);
  186. g = g * 5 + 0xe6546b64;
  187. h ^= a3 + a1;
  188. h = Rotate32(h, 19);
  189. h = h * 5 + 0xe6546b64;
  190. g ^= a4;
  191. g = bswap_32(g) * 5;
  192. h += a4 * 5;
  193. h = bswap_32(h);
  194. f += a0;
  195. PERMUTE3(f, h, g);
  196. s += 20;
  197. } while (--iters != 0);
  198. g = Rotate32(g, 11) * c1;
  199. g = Rotate32(g, 17) * c1;
  200. f = Rotate32(f, 11) * c1;
  201. f = Rotate32(f, 17) * c1;
  202. h = Rotate32(h + g, 19);
  203. h = h * 5 + 0xe6546b64;
  204. h = Rotate32(h, 17) * c1;
  205. h = Rotate32(h + f, 19);
  206. h = h * 5 + 0xe6546b64;
  207. h = Rotate32(h, 17) * c1;
  208. return h;
  209. }
  210. // Bitwise right rotate. Normally this will compile to a single
  211. // instruction, especially if the shift is a manifest constant.
  212. static uint64 Rotate(uint64 val, int shift) {
  213. // Avoid shifting by 64: doing so yields an undefined result.
  214. return shift == 0 ? val : ((val >> shift) | (val << (64 - shift)));
  215. }
  216. static uint64 ShiftMix(uint64 val) {
  217. return val ^ (val >> 47);
  218. }
  219. static uint64 HashLen16(uint64 u, uint64 v) {
  220. return Hash128to64(uint128(u, v));
  221. }
  222. static uint64 HashLen16(uint64 u, uint64 v, uint64 mul) {
  223. // Murmur-inspired hashing.
  224. uint64 a = (u ^ v) * mul;
  225. a ^= (a >> 47);
  226. uint64 b = (v ^ a) * mul;
  227. b ^= (b >> 47);
  228. b *= mul;
  229. return b;
  230. }
  231. static uint64 HashLen0to16(const char *s, size_t len) {
  232. if (len >= 8) {
  233. uint64 mul = k2 + len * 2;
  234. uint64 a = Fetch64(s) + k2;
  235. uint64 b = Fetch64(s + len - 8);
  236. uint64 c = Rotate(b, 37) * mul + a;
  237. uint64 d = (Rotate(a, 25) + b) * mul;
  238. return HashLen16(c, d, mul);
  239. }
  240. if (len >= 4) {
  241. uint64 mul = k2 + len * 2;
  242. uint64 a = Fetch32(s);
  243. return HashLen16(len + (a << 3), Fetch32(s + len - 4), mul);
  244. }
  245. if (len > 0) {
  246. uint8 a = s[0];
  247. uint8 b = s[len >> 1];
  248. uint8 c = s[len - 1];
  249. uint32 y = static_cast<uint32>(a) + (static_cast<uint32>(b) << 8);
  250. uint32 z = static_cast<uint32>( len + (static_cast<uint32>(c) << 2));
  251. return ShiftMix(y * k2 ^ z * k0) * k2;
  252. }
  253. return k2;
  254. }
  255. // This probably works well for 16-byte strings as well, but it may be overkill
  256. // in that case.
  257. static uint64 HashLen17to32(const char *s, size_t len) {
  258. uint64 mul = k2 + len * 2;
  259. uint64 a = Fetch64(s) * k1;
  260. uint64 b = Fetch64(s + 8);
  261. uint64 c = Fetch64(s + len - 8) * mul;
  262. uint64 d = Fetch64(s + len - 16) * k2;
  263. return HashLen16(Rotate(a + b, 43) + Rotate(c, 30) + d,
  264. a + Rotate(b + k2, 18) + c, mul);
  265. }
  266. // Return a 16-byte hash for 48 bytes. Quick and dirty.
  267. // Callers do best to use "random-looking" values for a and b.
  268. static pair<uint64, uint64> WeakHashLen32WithSeeds(
  269. uint64 w, uint64 x, uint64 y, uint64 z, uint64 a, uint64 b) {
  270. a += w;
  271. b = Rotate(b + a + z, 21);
  272. uint64 c = a;
  273. a += x;
  274. a += y;
  275. b += Rotate(a, 44);
  276. return make_pair(a + z, b + c);
  277. }
  278. // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
  279. static pair<uint64, uint64> WeakHashLen32WithSeeds(
  280. const char* s, uint64 a, uint64 b) {
  281. return WeakHashLen32WithSeeds(Fetch64(s),
  282. Fetch64(s + 8),
  283. Fetch64(s + 16),
  284. Fetch64(s + 24),
  285. a,
  286. b);
  287. }
  288. // Return an 8-byte hash for 33 to 64 bytes.
  289. static uint64 HashLen33to64(const char *s, size_t len) {
  290. uint64 mul = k2 + len * 2;
  291. uint64 a = Fetch64(s) * k2;
  292. uint64 b = Fetch64(s + 8);
  293. uint64 c = Fetch64(s + len - 24);
  294. uint64 d = Fetch64(s + len - 32);
  295. uint64 e = Fetch64(s + 16) * k2;
  296. uint64 f = Fetch64(s + 24) * 9;
  297. uint64 g = Fetch64(s + len - 8);
  298. uint64 h = Fetch64(s + len - 16) * mul;
  299. uint64 u = Rotate(a + g, 43) + (Rotate(b, 30) + c) * 9;
  300. uint64 v = ((a + g) ^ d) + f + 1;
  301. uint64 w = bswap_64((u + v) * mul) + h;
  302. uint64 x = Rotate(e + f, 42) + c;
  303. uint64 y = (bswap_64((v + w) * mul) + g) * mul;
  304. uint64 z = e + f + c;
  305. a = bswap_64((x + z) * mul + y) + b;
  306. b = ShiftMix((z + a) * mul + d + h) * mul;
  307. return b + x;
  308. }
  309. uint64 CityHash64(const char *s, size_t len) {
  310. if (len <= 32) {
  311. if (len <= 16) {
  312. return HashLen0to16(s, len);
  313. } else {
  314. return HashLen17to32(s, len);
  315. }
  316. } else if (len <= 64) {
  317. return HashLen33to64(s, len);
  318. }
  319. // For strings over 64 bytes we hash the end first, and then as we
  320. // loop we keep 56 bytes of state: v, w, x, y, and z.
  321. uint64 x = Fetch64(s + len - 40);
  322. uint64 y = Fetch64(s + len - 16) + Fetch64(s + len - 56);
  323. uint64 z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24));
  324. pair<uint64, uint64> v = WeakHashLen32WithSeeds(s + len - 64, len, z);
  325. pair<uint64, uint64> w = WeakHashLen32WithSeeds(s + len - 32, y + k1, x);
  326. x = x * k1 + Fetch64(s);
  327. // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks.
  328. len = (len - 1) & ~static_cast<size_t>(63);
  329. do {
  330. x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1;
  331. y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1;
  332. x ^= w.second;
  333. y += v.first + Fetch64(s + 40);
  334. z = Rotate(z + w.first, 33) * k1;
  335. v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
  336. w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16));
  337. std::swap(z, x);
  338. s += 64;
  339. len -= 64;
  340. } while (len != 0);
  341. return HashLen16(HashLen16(v.first, w.first) + ShiftMix(y) * k1 + z,
  342. HashLen16(v.second, w.second) + x);
  343. }
  344. uint64 CityHash64WithSeed(const char *s, size_t len, uint64 seed) {
  345. return CityHash64WithSeeds(s, len, k2, seed);
  346. }
  347. uint64 CityHash64WithSeeds(const char *s, size_t len,
  348. uint64 seed0, uint64 seed1) {
  349. return HashLen16(CityHash64(s, len) - seed0, seed1);
  350. }
  351. // A subroutine for CityHash128(). Returns a decent 128-bit hash for strings
  352. // of any length representable in signed long. Based on City and Murmur.
  353. static uint128 CityMurmur(const char *s, size_t len, uint128 seed) {
  354. uint64 a = Uint128Low64(seed);
  355. uint64 b = Uint128High64(seed);
  356. uint64 c = 0;
  357. uint64 d = 0;
  358. signed long l = len - 16;
  359. if (l <= 0) { // len <= 16
  360. a = ShiftMix(a * k1) * k1;
  361. c = b * k1 + HashLen0to16(s, len);
  362. d = ShiftMix(a + (len >= 8 ? Fetch64(s) : c));
  363. } else { // len > 16
  364. c = HashLen16(Fetch64(s + len - 8) + k1, a);
  365. d = HashLen16(b + len, c + Fetch64(s + len - 16));
  366. a += d;
  367. do {
  368. a ^= ShiftMix(Fetch64(s) * k1) * k1;
  369. a *= k1;
  370. b ^= a;
  371. c ^= ShiftMix(Fetch64(s + 8) * k1) * k1;
  372. c *= k1;
  373. d ^= c;
  374. s += 16;
  375. l -= 16;
  376. } while (l > 0);
  377. }
  378. a = HashLen16(a, c);
  379. b = HashLen16(d, b);
  380. return uint128(a ^ b, HashLen16(b, a));
  381. }
  382. uint128 CityHash128WithSeed(const char *s, size_t len, uint128 seed) {
  383. if (len < 128) {
  384. return CityMurmur(s, len, seed);
  385. }
  386. // We expect len >= 128 to be the common case. Keep 56 bytes of state:
  387. // v, w, x, y, and z.
  388. pair<uint64, uint64> v, w;
  389. uint64 x = Uint128Low64(seed);
  390. uint64 y = Uint128High64(seed);
  391. uint64 z = len * k1;
  392. v.first = Rotate(y ^ k1, 49) * k1 + Fetch64(s);
  393. v.second = Rotate(v.first, 42) * k1 + Fetch64(s + 8);
  394. w.first = Rotate(y + z, 35) * k1 + x;
  395. w.second = Rotate(x + Fetch64(s + 88), 53) * k1;
  396. // This is the same inner loop as CityHash64(), manually unrolled.
  397. do {
  398. x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1;
  399. y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1;
  400. x ^= w.second;
  401. y += v.first + Fetch64(s + 40);
  402. z = Rotate(z + w.first, 33) * k1;
  403. v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
  404. w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16));
  405. std::swap(z, x);
  406. s += 64;
  407. x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1;
  408. y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1;
  409. x ^= w.second;
  410. y += v.first + Fetch64(s + 40);
  411. z = Rotate(z + w.first, 33) * k1;
  412. v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
  413. w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16));
  414. std::swap(z, x);
  415. s += 64;
  416. len -= 128;
  417. } while (LIKELY(len >= 128));
  418. x += Rotate(v.first + z, 49) * k0;
  419. y = y * k0 + Rotate(w.second, 37);
  420. z = z * k0 + Rotate(w.first, 27);
  421. w.first *= 9;
  422. v.first *= k0;
  423. // If 0 < len < 128, hash up to 4 chunks of 32 bytes each from the end of s.
  424. for (size_t tail_done = 0; tail_done < len; ) {
  425. tail_done += 32;
  426. y = Rotate(x + y, 42) * k0 + v.second;
  427. w.first += Fetch64(s + len - tail_done + 16);
  428. x = x * k0 + w.first;
  429. z += w.second + Fetch64(s + len - tail_done);
  430. w.second += v.first;
  431. v = WeakHashLen32WithSeeds(s + len - tail_done, v.first + z, v.second);
  432. v.first *= k0;
  433. }
  434. // At this point our 56 bytes of state should contain more than
  435. // enough information for a strong 128-bit hash. We use two
  436. // different 56-byte-to-8-byte hashes to get a 16-byte final result.
  437. x = HashLen16(x, v.first);
  438. y = HashLen16(y + z, w.first);
  439. return uint128(HashLen16(x + v.second, w.second) + y,
  440. HashLen16(x + w.second, y + v.second));
  441. }
  442. uint128 CityHash128(const char *s, size_t len) {
  443. return len >= 16 ?
  444. CityHash128WithSeed(s + 16, len - 16,
  445. uint128(Fetch64(s), Fetch64(s + 8) + k0)) :
  446. CityHash128WithSeed(s, len, uint128(k0, k1));
  447. }
  448. #ifdef __SSE4_2__
  449. #include "citycrc.h"
  450. #include <nmmintrin.h>
  451. // Requires len >= 240.
  452. static void CityHashCrc256Long(const char *s, size_t len,
  453. uint32 seed, uint64 *result) {
  454. uint64 a = Fetch64(s + 56) + k0;
  455. uint64 b = Fetch64(s + 96) + k0;
  456. uint64 c = result[0] = HashLen16(b, len);
  457. uint64 d = result[1] = Fetch64(s + 120) * k0 + len;
  458. uint64 e = Fetch64(s + 184) + seed;
  459. uint64 f = 0;
  460. uint64 g = 0;
  461. uint64 h = c + d;
  462. uint64 x = seed;
  463. uint64 y = 0;
  464. uint64 z = 0;
  465. // 240 bytes of input per iter.
  466. size_t iters = len / 240;
  467. len -= iters * 240;
  468. do {
  469. #undef CHUNK
  470. #define CHUNK(r) \
  471. PERMUTE3(x, z, y); \
  472. b += Fetch64(s); \
  473. c += Fetch64(s + 8); \
  474. d += Fetch64(s + 16); \
  475. e += Fetch64(s + 24); \
  476. f += Fetch64(s + 32); \
  477. a += b; \
  478. h += f; \
  479. b += c; \
  480. f += d; \
  481. g += e; \
  482. e += z; \
  483. g += x; \
  484. z = _mm_crc32_u64(z, b + g); \
  485. y = _mm_crc32_u64(y, e + h); \
  486. x = _mm_crc32_u64(x, f + a); \
  487. e = Rotate(e, r); \
  488. c += e; \
  489. s += 40
  490. CHUNK(0); PERMUTE3(a, h, c);
  491. CHUNK(33); PERMUTE3(a, h, f);
  492. CHUNK(0); PERMUTE3(b, h, f);
  493. CHUNK(42); PERMUTE3(b, h, d);
  494. CHUNK(0); PERMUTE3(b, h, e);
  495. CHUNK(33); PERMUTE3(a, h, e);
  496. } while (--iters > 0);
  497. while (len >= 40) {
  498. CHUNK(29);
  499. e ^= Rotate(a, 20);
  500. h += Rotate(b, 30);
  501. g ^= Rotate(c, 40);
  502. f += Rotate(d, 34);
  503. PERMUTE3(c, h, g);
  504. len -= 40;
  505. }
  506. if (len > 0) {
  507. s = s + len - 40;
  508. // cppcheck-suppress uselessAssignmentPtrArg
  509. CHUNK(33);
  510. e ^= Rotate(a, 43);
  511. h += Rotate(b, 42);
  512. g ^= Rotate(c, 41);
  513. f += Rotate(d, 40);
  514. }
  515. result[0] ^= h;
  516. result[1] ^= g;
  517. g += h;
  518. a = HashLen16(a, g + z);
  519. x += y << 32;
  520. b += x;
  521. c = HashLen16(c, z) + h;
  522. d = HashLen16(d, e + result[0]);
  523. g += e;
  524. h += HashLen16(x, f);
  525. e = HashLen16(a, d) + g;
  526. z = HashLen16(b, c) + a;
  527. y = HashLen16(g, h) + c;
  528. result[0] = e + z + y + x;
  529. a = ShiftMix((a + y) * k0) * k0 + b;
  530. result[1] += a + result[0];
  531. a = ShiftMix(a * k0) * k0 + c;
  532. result[2] = a + result[1];
  533. a = ShiftMix((a + e) * k0) * k0;
  534. result[3] = a + result[2];
  535. }
  536. // Requires len < 240.
  537. static void CityHashCrc256Short(const char *s, size_t len, uint64 *result) {
  538. char buf[240];
  539. memcpy(buf, s, len);
  540. memset(buf + len, 0, 240 - len);
  541. CityHashCrc256Long(buf, 240, ~static_cast<uint32>(len), result);
  542. }
  543. void CityHashCrc256(const char *s, size_t len, uint64 *result) {
  544. if (LIKELY(len >= 240)) {
  545. CityHashCrc256Long(s, len, 0, result);
  546. } else {
  547. CityHashCrc256Short(s, len, result);
  548. }
  549. }
  550. uint128 CityHashCrc128WithSeed(const char *s, size_t len, uint128 seed) {
  551. if (len <= 900) {
  552. return CityHash128WithSeed(s, len, seed);
  553. } else {
  554. uint64 result[4];
  555. CityHashCrc256(s, len, result);
  556. uint64 u = Uint128High64(seed) + result[0];
  557. uint64 v = Uint128Low64(seed) + result[1];
  558. return uint128(HashLen16(u, v + result[2]),
  559. HashLen16(Rotate(v, 32), u * k0 + result[3]));
  560. }
  561. }
  562. uint128 CityHashCrc128(const char *s, size_t len) {
  563. if (len <= 900) {
  564. return CityHash128(s, len);
  565. } else {
  566. uint64 result[4];
  567. CityHashCrc256(s, len, result);
  568. return uint128(result[2], result[3]);
  569. }
  570. }
  571. #endif
  572. #endif // #if CDS_BUILD_BITS == 64