-//-----------------------------------------------------------------------------
-//MurmurHash3 was written by Austin Appleby, and is placed in the public
-//domain. The author hereby disclaims copyright to this source code.
-
-// Note - The x86 and x64 versions do _not_ produce the same results, as the
-// algorithms are optimized for their respective platforms. You can still
-// compile and run any of them on any platform, but your performance with the
-// non-native version will be less than optimal.
+/*
+ +--------------------------------------------------------------------+
+ | libmemcached - C/C++ Client Library for memcached |
+ +--------------------------------------------------------------------+
+ | Redistribution and use in source and binary forms, with or without |
+ | modification, are permitted under the terms of the BSD license. |
+ | You should have received a copy of the license in a bundled file |
+ | named LICENSE; in case you did not receive a copy you can review |
+ | the terms online at: https://opensource.org/licenses/BSD-3-Clause |
+ +--------------------------------------------------------------------+
+ | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ |
+ | Copyright (c) 2020 Michael Wallner <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
#include "libhashkit/hashkitcon.h"
// Platform-specific functions and macros
#ifdef __GNUC__
-#define FORCE_INLINE __attribute__((always_inline)) inline
+# define FORCE_INLINE __attribute__((always_inline)) inline
#else
-#define FORCE_INLINE inline
+# define FORCE_INLINE inline
#endif
-static FORCE_INLINE uint32_t rotl32 ( uint32_t x, int8_t r )
-{
+static FORCE_INLINE uint32_t rotl32(uint32_t x, int8_t r) {
return (x << r) | (x >> (32 - r));
}
-#define ROTL32(x,y) rotl32(x,y)
+#define ROTL32(x, y) rotl32(x, y)
//-----------------------------------------------------------------------------
// Block read - if your platform needs to do endian-swapping or can only
#include <cassert>
#include <cstring>
-template <typename T>
+template<typename T>
static inline T getblock(const T *blocks, int i) {
T b;
memcpy(&b, ((const uint8_t *) blocks) + i * sizeof(T), sizeof(T));
//-----------------------------------------------------------------------------
// Finalization mix - force all bits of a hash block to avalanche
-static FORCE_INLINE uint32_t fmix32 ( uint32_t h )
-{
+static FORCE_INLINE uint32_t fmix32(uint32_t h) {
h ^= h >> 16;
h *= 0x85ebca6b;
h ^= h >> 13;
//-----------------------------------------------------------------------------
-void MurmurHash3_x86_32 ( const void * key, int len,
- uint32_t seed, void * out )
-{
- const uint8_t * data = (const uint8_t*)key;
+void MurmurHash3_x86_32(const void *key, int len, uint32_t seed, void *out) {
+ const uint8_t *data = (const uint8_t *) key;
const int nblocks = len / 4;
int i;
//----------
// body
- const uint32_t * blocks = (const uint32_t *)(data + nblocks*4);
+ const uint32_t *blocks = (const uint32_t *) (data + nblocks * 4);
- for(i = -nblocks; i; i++)
- {
- uint32_t k1 = getblock(blocks,i);
+ for (i = -nblocks; i; i++) {
+ uint32_t k1 = getblock(blocks, i);
#if WORDS_BIGENDIAN
k1 = BYTESWAP_32(k1);
#endif
k1 *= c1;
- k1 = ROTL32(k1,15);
+ k1 = ROTL32(k1, 15);
k1 *= c2;
h1 ^= k1;
- h1 = ROTL32(h1,13);
- h1 = h1*5+0xe6546b64;
+ h1 = ROTL32(h1, 13);
+ h1 = h1 * 5 + 0xe6546b64;
}
//----------
// tail
- const uint8_t * tail = (const uint8_t*)(data + nblocks*4);
+ const uint8_t *tail = (const uint8_t *) (data + nblocks * 4);
uint32_t k1 = 0;
memcpy(&k1, tail, len & 3);
#endif
k1 *= c1;
- k1 = ROTL32(k1,15);
+ k1 = ROTL32(k1, 15);
k1 *= c2;
h1 ^= k1;
h1 = fmix32(h1);
- *(uint32_t*)out = h1;
+ *(uint32_t *) out = h1;
}