diff --git a/ext/cityhash/city.cpp b/ext/cityhash/city.cpp index c38da1e2ce..28e766b010 100644 --- a/ext/cityhash/city.cpp +++ b/ext/cityhash/city.cpp @@ -53,13 +53,39 @@ static uint32 UNALIGNED_LOAD32(const char *p) { #ifdef _MSC_VER #define bswap_32(x) _byteswap_ulong(x) #define bswap_64(x) _byteswap_uint64(x) + #elif defined(__GLIBC__) #include + #elif defined(__APPLE__) // Mac OS X / Darwin features #include #define bswap_32(x) OSSwapInt32(x) #define bswap_64(x) OSSwapInt64(x) + +#elif defined(__sun) || defined(sun) +#include +#define bswap_32(x) BSWAP_32(x) +#define bswap_64(x) BSWAP_64(x) + +#elif defined(__FreeBSD__) +#include +#define bswap_32(x) bswap32(x) +#define bswap_64(x) bswap64(x) + +#elif defined(__OpenBSD__) +#include +#define bswap_32(x) swap32(x) +#define bswap_64(x) swap64(x) + +#elif defined(__NetBSD__) +#include +#include +#if defined(__BSWAP_RENAME) && !defined(__bswap_32) +#define bswap_32(x) bswap32(x) +#define bswap_64(x) bswap64(x) +#endif + #else #define bswap_32(x) (0 | ((x & 0x000000ff) << 24) \ | ((x & 0x0000ff00) << 8) \ @@ -105,8 +131,8 @@ static const uint64 k1 = 0xb492b66fbe98f273ULL; static const uint64 k2 = 0x9ae16a3b2f90404fULL; // Magic numbers for 32-bit hashing. Copied from Murmur3. -static const uint32_t c1 = 0xcc9e2d51; -static const uint32_t c2 = 0x1b873593; +static const uint32 c1 = 0xcc9e2d51; +static const uint32 c2 = 0x1b873593; // A 32-bit to 32-bit integer hash copied from Murmur3. static uint32 fmix(uint32 h) @@ -153,7 +179,8 @@ static uint32 Hash32Len0to4(const char *s, size_t len) { uint32 b = 0; uint32 c = 9; for (size_t i = 0; i < len; i++) { - b = b * c1 + s[i]; + signed char v = s[i]; + b = b * c1 + v; c ^= b; } return fmix(Mur(b, Mur(len, c))); diff --git a/ext/cityhash/city.h b/ext/cityhash/city.h index ec52f2b5b2..94499ce419 100644 --- a/ext/cityhash/city.h +++ b/ext/cityhash/city.h @@ -38,6 +38,7 @@ // nearest competitor is Bob Jenkins' Spooky. We don't have great data for // other 64-bit CPUs, but for long strings we know that Spooky is slightly // faster than CityHash on some relatively recent AMD x86-64 CPUs, for example. +// Note that CityHashCrc128 is declared in citycrc.h. // // For 32-bit x86 code, we don't know of anything faster than CityHash32 that // is of comparable quality. We believe our nearest competitor is Murmur3A. @@ -45,6 +46,9 @@ // // Functions in the CityHash family are not suitable for cryptography. // +// Please see CityHash's README file for more details on our performance +// measurements and so on. +// // WARNING: This code has been only lightly tested on big-endian platforms! // It is known to work well on little-endian platforms that have a small penalty // for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs.