266 lines
7.4 KiB
Diff
266 lines
7.4 KiB
Diff
|
diff --git a/base/third_party/cityhash/city.cc b/base/third_party/cityhash/city.cc
|
||
|
index 41cd5ee16993..22e3b4981ff5 100644
|
||
|
--- a/base/third_party/cityhash/city.cc
|
||
|
+++ b/base/third_party/cityhash/city.cc
|
||
|
@@ -27,25 +27,13 @@
|
||
|
// possible hash functions, by using SIMD instructions, or by
|
||
|
// compromising on hash quality.
|
||
|
|
||
|
-#include "config.h"
|
||
|
-#include <city.h>
|
||
|
+#include "city.h"
|
||
|
|
||
|
#include <algorithm>
|
||
|
#include <string.h> // for memcpy and memset
|
||
|
|
||
|
-using namespace std;
|
||
|
-
|
||
|
-static uint64 UNALIGNED_LOAD64(const char *p) {
|
||
|
- uint64 result;
|
||
|
- memcpy(&result, p, sizeof(result));
|
||
|
- return result;
|
||
|
-}
|
||
|
-
|
||
|
-static uint32 UNALIGNED_LOAD32(const char *p) {
|
||
|
- uint32 result;
|
||
|
- memcpy(&result, p, sizeof(result));
|
||
|
- return result;
|
||
|
-}
|
||
|
+using std::make_pair;
|
||
|
+using std::pair;
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
|
||
|
@@ -89,10 +77,19 @@ static uint32 UNALIGNED_LOAD32(const char *p) {
|
||
|
|
||
|
#else
|
||
|
|
||
|
-#include <byteswap.h>
|
||
|
+// XXX(cavalcanti): building 'native_client' fails with this header.
|
||
|
+//#include <byteswap.h>
|
||
|
+
|
||
|
+// Falling back to compiler builtins instead.
|
||
|
+#define bswap_32(x) __builtin_bswap32(x)
|
||
|
+#define bswap_64(x) __builtin_bswap64(x)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
+namespace base {
|
||
|
+namespace internal {
|
||
|
+namespace cityhash_v111 {
|
||
|
+
|
||
|
#ifdef WORDS_BIGENDIAN
|
||
|
#define uint32_in_expected_order(x) (bswap_32(x))
|
||
|
#define uint64_in_expected_order(x) (bswap_64(x))
|
||
|
@@ -109,6 +106,18 @@ static uint32 UNALIGNED_LOAD32(const char *p) {
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
+static uint64 UNALIGNED_LOAD64(const char *p) {
|
||
|
+ uint64 result;
|
||
|
+ memcpy(&result, p, sizeof(result));
|
||
|
+ return result;
|
||
|
+}
|
||
|
+
|
||
|
+static uint32 UNALIGNED_LOAD32(const char *p) {
|
||
|
+ uint32 result;
|
||
|
+ memcpy(&result, p, sizeof(result));
|
||
|
+ return result;
|
||
|
+}
|
||
|
+
|
||
|
static uint64 Fetch64(const char *p) {
|
||
|
return uint64_in_expected_order(UNALIGNED_LOAD64(p));
|
||
|
}
|
||
|
@@ -217,11 +226,11 @@ uint32 CityHash32(const char *s, size_t len) {
|
||
|
f = f * 5 + 0xe6546b64;
|
||
|
size_t iters = (len - 1) / 20;
|
||
|
do {
|
||
|
- uint32 a0 = Rotate32(Fetch32(s) * c1, 17) * c2;
|
||
|
- uint32 a1 = Fetch32(s + 4);
|
||
|
- uint32 a2 = Rotate32(Fetch32(s + 8) * c1, 17) * c2;
|
||
|
- uint32 a3 = Rotate32(Fetch32(s + 12) * c1, 17) * c2;
|
||
|
- uint32 a4 = Fetch32(s + 16);
|
||
|
+ a0 = Rotate32(Fetch32(s) * c1, 17) * c2;
|
||
|
+ a1 = Fetch32(s + 4);
|
||
|
+ a2 = Rotate32(Fetch32(s + 8) * c1, 17) * c2;
|
||
|
+ a3 = Rotate32(Fetch32(s + 12) * c1, 17) * c2;
|
||
|
+ a4 = Fetch32(s + 16);
|
||
|
h ^= a0;
|
||
|
h = Rotate32(h, 18);
|
||
|
h = h * 5 + 0xe6546b64;
|
||
|
@@ -512,135 +521,7 @@ uint128 CityHash128(const char *s, size_t len) {
|
||
|
CityHash128WithSeed(s, len, uint128(k0, k1));
|
||
|
}
|
||
|
|
||
|
-#ifdef __SSE4_2__
|
||
|
-#include <citycrc.h>
|
||
|
-#include <nmmintrin.h>
|
||
|
-
|
||
|
-// Requires len >= 240.
|
||
|
-static void CityHashCrc256Long(const char *s, size_t len,
|
||
|
- uint32 seed, uint64 *result) {
|
||
|
- uint64 a = Fetch64(s + 56) + k0;
|
||
|
- uint64 b = Fetch64(s + 96) + k0;
|
||
|
- uint64 c = result[0] = HashLen16(b, len);
|
||
|
- uint64 d = result[1] = Fetch64(s + 120) * k0 + len;
|
||
|
- uint64 e = Fetch64(s + 184) + seed;
|
||
|
- uint64 f = 0;
|
||
|
- uint64 g = 0;
|
||
|
- uint64 h = c + d;
|
||
|
- uint64 x = seed;
|
||
|
- uint64 y = 0;
|
||
|
- uint64 z = 0;
|
||
|
-
|
||
|
- // 240 bytes of input per iter.
|
||
|
- size_t iters = len / 240;
|
||
|
- len -= iters * 240;
|
||
|
- do {
|
||
|
-#undef CHUNK
|
||
|
-#define CHUNK(r) \
|
||
|
- PERMUTE3(x, z, y); \
|
||
|
- b += Fetch64(s); \
|
||
|
- c += Fetch64(s + 8); \
|
||
|
- d += Fetch64(s + 16); \
|
||
|
- e += Fetch64(s + 24); \
|
||
|
- f += Fetch64(s + 32); \
|
||
|
- a += b; \
|
||
|
- h += f; \
|
||
|
- b += c; \
|
||
|
- f += d; \
|
||
|
- g += e; \
|
||
|
- e += z; \
|
||
|
- g += x; \
|
||
|
- z = _mm_crc32_u64(z, b + g); \
|
||
|
- y = _mm_crc32_u64(y, e + h); \
|
||
|
- x = _mm_crc32_u64(x, f + a); \
|
||
|
- e = Rotate(e, r); \
|
||
|
- c += e; \
|
||
|
- s += 40
|
||
|
-
|
||
|
- CHUNK(0); PERMUTE3(a, h, c);
|
||
|
- CHUNK(33); PERMUTE3(a, h, f);
|
||
|
- CHUNK(0); PERMUTE3(b, h, f);
|
||
|
- CHUNK(42); PERMUTE3(b, h, d);
|
||
|
- CHUNK(0); PERMUTE3(b, h, e);
|
||
|
- CHUNK(33); PERMUTE3(a, h, e);
|
||
|
- } while (--iters > 0);
|
||
|
-
|
||
|
- while (len >= 40) {
|
||
|
- CHUNK(29);
|
||
|
- e ^= Rotate(a, 20);
|
||
|
- h += Rotate(b, 30);
|
||
|
- g ^= Rotate(c, 40);
|
||
|
- f += Rotate(d, 34);
|
||
|
- PERMUTE3(c, h, g);
|
||
|
- len -= 40;
|
||
|
- }
|
||
|
- if (len > 0) {
|
||
|
- s = s + len - 40;
|
||
|
- CHUNK(33);
|
||
|
- e ^= Rotate(a, 43);
|
||
|
- h += Rotate(b, 42);
|
||
|
- g ^= Rotate(c, 41);
|
||
|
- f += Rotate(d, 40);
|
||
|
- }
|
||
|
- result[0] ^= h;
|
||
|
- result[1] ^= g;
|
||
|
- g += h;
|
||
|
- a = HashLen16(a, g + z);
|
||
|
- x += y << 32;
|
||
|
- b += x;
|
||
|
- c = HashLen16(c, z) + h;
|
||
|
- d = HashLen16(d, e + result[0]);
|
||
|
- g += e;
|
||
|
- h += HashLen16(x, f);
|
||
|
- e = HashLen16(a, d) + g;
|
||
|
- z = HashLen16(b, c) + a;
|
||
|
- y = HashLen16(g, h) + c;
|
||
|
- result[0] = e + z + y + x;
|
||
|
- a = ShiftMix((a + y) * k0) * k0 + b;
|
||
|
- result[1] += a + result[0];
|
||
|
- a = ShiftMix(a * k0) * k0 + c;
|
||
|
- result[2] = a + result[1];
|
||
|
- a = ShiftMix((a + e) * k0) * k0;
|
||
|
- result[3] = a + result[2];
|
||
|
-}
|
||
|
-
|
||
|
-// Requires len < 240.
|
||
|
-static void CityHashCrc256Short(const char *s, size_t len, uint64 *result) {
|
||
|
- char buf[240];
|
||
|
- memcpy(buf, s, len);
|
||
|
- memset(buf + len, 0, 240 - len);
|
||
|
- CityHashCrc256Long(buf, 240, ~static_cast<uint32>(len), result);
|
||
|
-}
|
||
|
+} // namespace cityhash_v111
|
||
|
+} // namespace internal
|
||
|
+} // namespace base
|
||
|
|
||
|
-void CityHashCrc256(const char *s, size_t len, uint64 *result) {
|
||
|
- if (LIKELY(len >= 240)) {
|
||
|
- CityHashCrc256Long(s, len, 0, result);
|
||
|
- } else {
|
||
|
- CityHashCrc256Short(s, len, result);
|
||
|
- }
|
||
|
-}
|
||
|
-
|
||
|
-uint128 CityHashCrc128WithSeed(const char *s, size_t len, uint128 seed) {
|
||
|
- if (len <= 900) {
|
||
|
- return CityHash128WithSeed(s, len, seed);
|
||
|
- } else {
|
||
|
- uint64 result[4];
|
||
|
- CityHashCrc256(s, len, result);
|
||
|
- uint64 u = Uint128High64(seed) + result[0];
|
||
|
- uint64 v = Uint128Low64(seed) + result[1];
|
||
|
- return uint128(HashLen16(u, v + result[2]),
|
||
|
- HashLen16(Rotate(v, 32), u * k0 + result[3]));
|
||
|
- }
|
||
|
-}
|
||
|
-
|
||
|
-uint128 CityHashCrc128(const char *s, size_t len) {
|
||
|
- if (len <= 900) {
|
||
|
- return CityHash128(s, len);
|
||
|
- } else {
|
||
|
- uint64 result[4];
|
||
|
- CityHashCrc256(s, len, result);
|
||
|
- return uint128(result[2], result[3]);
|
||
|
- }
|
||
|
-}
|
||
|
-
|
||
|
-#endif
|
||
|
diff --git a/base/third_party/cityhash/city.h b/base/third_party/cityhash/city.h
|
||
|
index 94499ce419c7..e4672f6d44da 100644
|
||
|
--- a/base/third_party/cityhash/city.h
|
||
|
+++ b/base/third_party/cityhash/city.h
|
||
|
@@ -59,13 +59,20 @@
|
||
|
// of a+b is easily derived from the hashes of a and b. This property
|
||
|
// doesn't hold for any hash functions in this file.
|
||
|
|
||
|
-#ifndef CITY_HASH_H_
|
||
|
-#define CITY_HASH_H_
|
||
|
+#ifndef BASE_THIRD_PARTY_CITYHASH_CITY_H_
|
||
|
+#define BASE_THIRD_PARTY_CITYHASH_CITY_H_
|
||
|
|
||
|
#include <stdlib.h> // for size_t.
|
||
|
#include <stdint.h>
|
||
|
#include <utility>
|
||
|
|
||
|
+// XXX(cavalcantii): Declaring it inside of the 'base' namespace allows to
|
||
|
+// handle linker symbol clash error with deprecated CityHash from
|
||
|
+// third_party/smhasher in a few unit tests.
|
||
|
+namespace base {
|
||
|
+namespace internal {
|
||
|
+namespace cityhash_v111 {
|
||
|
+
|
||
|
typedef uint8_t uint8;
|
||
|
typedef uint32_t uint32;
|
||
|
typedef uint64_t uint64;
|
||
|
@@ -109,4 +116,8 @@ inline uint64 Hash128to64(const uint128& x) {
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
+} // namespace cityhash_v111
|
||
|
+} // namespace internal
|
||
|
+} // namespace base
|
||
|
+
|
||
|
#endif // CITY_HASH_H_
|