X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibhashkit%2Fmurmur3.cc;h=fa83b76b0af2f0041ef76f9069c6994850d22eec;hb=1a82d708fca6b4c379dc035d05763ee80aae6d72;hp=f685a240358675244bc24cf9e5f905703c03c235;hpb=95d03c7c94f6888d3c904d2321e6f526db7cff7f;p=m6w6%2Flibmemcached diff --git a/src/libhashkit/murmur3.cc b/src/libhashkit/murmur3.cc index f685a240..fa83b76b 100644 --- a/src/libhashkit/murmur3.cc +++ b/src/libhashkit/murmur3.cc @@ -1,11 +1,17 @@ -//----------------------------------------------------------------------------- -//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 | + +--------------------------------------------------------------------+ +*/ #include "libhashkit/hashkitcon.h" @@ -15,17 +21,16 @@ // 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 @@ -33,7 +38,7 @@ static FORCE_INLINE uint32_t rotl32 ( uint32_t x, int8_t r ) #include #include -template +template static inline T getblock(const T *blocks, int i) { T b; memcpy(&b, ((const uint8_t *) blocks) + i * sizeof(T), sizeof(T)); @@ -43,8 +48,7 @@ static inline T getblock(const T *blocks, int i) { //----------------------------------------------------------------------------- // 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; @@ -56,10 +60,8 @@ static FORCE_INLINE uint32_t fmix32 ( uint32_t h ) //----------------------------------------------------------------------------- -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; @@ -71,28 +73,27 @@ void MurmurHash3_x86_32 ( const void * key, int len, //---------- // 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); @@ -101,7 +102,7 @@ void MurmurHash3_x86_32 ( const void * key, int len, #endif k1 *= c1; - k1 = ROTL32(k1,15); + k1 = ROTL32(k1, 15); k1 *= c2; h1 ^= k1; @@ -112,5 +113,5 @@ void MurmurHash3_x86_32 ( const void * key, int len, h1 = fmix32(h1); - *(uint32_t*)out = h1; + *(uint32_t *) out = h1; }