diff options
author | ariel faigon <ariel.git@yendor.com> | 2012-08-14 07:13:42 +0400 |
---|---|---|
committer | ariel faigon <ariel.git@yendor.com> | 2012-08-14 07:13:42 +0400 |
commit | d2133035e1d558b926fdf9255d0533ede777e436 (patch) | |
tree | af1ecd024c71a8ce8c30881a5b04ccb7fa18ba75 /vowpalwabbit/hash.cc | |
parent | 40ffdb5f9c325ff177e328f03c5711212ec94172 (diff) |
hash.cc: improve readability & style
Diffstat (limited to 'vowpalwabbit/hash.cc')
-rw-r--r-- | vowpalwabbit/hash.cc | 126 |
1 files changed, 54 insertions, 72 deletions
diff --git a/vowpalwabbit/hash.cc b/vowpalwabbit/hash.cc index 690186b1..215f7cef 100644 --- a/vowpalwabbit/hash.cc +++ b/vowpalwabbit/hash.cc @@ -14,19 +14,19 @@ // Adopted for VW and contributed by Ariel Faigon. // +#include <sys/types.h> /* defines size_t */ + // Platform-specific functions and macros // Microsoft Visual Studio #if defined(_MSC_VER) typedef unsigned char uint8_t; - typedef unsigned long uint32_t; + typedef unsigned long uint32_t; typedef unsigned __int64 uint64_t; // Other compilers #else // defined(_MSC_VER) -# include <stdint.h> /* defines uint32_t etc */ +# include <stdint.h> /* defines uint32_t etc */ #endif // !defined(_MSC_VER) -#include <sys/types.h> /* defines size_t */ - //----------------------------------------------------------------------------- // MurmurHash3 was written by Austin Appleby, and is placed in the public // domain. The author hereby disclaims copyright to this source code. @@ -39,34 +39,26 @@ //----------------------------------------------------------------------------- // Platform-specific functions and macros -// Microsoft Visual Studio - -#if defined(_MSC_VER) - -#define FORCE_INLINE __forceinline - -#include <stdlib.h> - -#define ROTL32(x,y) _rotl(x,y) - -#define BIG_CONSTANT(x) (x) +#if defined(_MSC_VER) // Microsoft Visual Studio -// Other compilers +# define FORCE_INLINE __forceinline +# include <stdlib.h> +# define ROTL32(x,y) _rotl(x,y) +# define BIG_CONSTANT(x) (x) -#else // defined(_MSC_VER) +#else // Other compilers -#define FORCE_INLINE __attribute__((always_inline)) +# define FORCE_INLINE __attribute__((always_inline)) -inline uint32_t rotl32 ( uint32_t x, int8_t r ) -{ - return (x << r) | (x >> (32 - r)); -} + 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) +# define BIG_CONSTANT(x) (x##LLU) -#define BIG_CONSTANT(x) (x##LLU) - -#endif // !defined(_MSC_VER) +#endif //----------------------------------------------------------------------------- // Block read - if your platform needs to do endian-swapping or can only @@ -74,7 +66,7 @@ inline uint32_t rotl32 ( uint32_t x, int8_t r ) FORCE_INLINE uint32_t getblock ( const uint32_t * p, int i ) { - return p[i]; + return p[i]; } //----------------------------------------------------------------------------- @@ -82,66 +74,56 @@ FORCE_INLINE uint32_t getblock ( const uint32_t * p, int i ) FORCE_INLINE uint32_t fmix ( uint32_t h ) { - h ^= h >> 16; - h *= 0x85ebca6b; - h ^= h >> 13; - h *= 0xc2b2ae35; - h ^= h >> 16; + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; - return h; + return h; } //----------------------------------------------------------------------------- uint32_t uniform_hash (const void * key, size_t len, uint32_t seed) { - const uint8_t * data = (const uint8_t*)key; - const int nblocks = len / 4; + const uint8_t * data = (const uint8_t*)key; + const int nblocks = len / 4; - uint32_t h1 = seed; + uint32_t h1 = seed; - const uint32_t c1 = 0xcc9e2d51; - const uint32_t c2 = 0x1b873593; + const uint32_t c1 = 0xcc9e2d51; + const uint32_t c2 = 0x1b873593; - //---------- - // body + // --- body + const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); - const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); + for (int i = -nblocks; i; i++) { + uint32_t k1 = getblock(blocks,i); - for(int i = -nblocks; i; i++) - { - uint32_t k1 = getblock(blocks,i); + k1 *= c1; + k1 = ROTL32(k1,15); + k1 *= c2; - k1 *= c1; - k1 = ROTL32(k1,15); - k1 *= c2; - - h1 ^= k1; - h1 = ROTL32(h1,13); - h1 = h1*5+0xe6546b64; - } + h1 ^= k1; + h1 = ROTL32(h1,13); + h1 = h1*5+0xe6546b64; + } - //---------- - // tail + // --- 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; - uint32_t k1 = 0; + switch(len & 3) { + case 3: k1 ^= tail[2] << 16; + case 2: k1 ^= tail[1] << 8; + case 1: k1 ^= tail[0]; + k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1; + } - switch(len & 3) - { - case 3: k1 ^= tail[2] << 16; - case 2: k1 ^= tail[1] << 8; - case 1: k1 ^= tail[0]; - k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1; - }; + // --- finalization + h1 ^= len; - //---------- - // finalization - - h1 ^= len; - - h1 = fmix(h1); - - return h1; -} + return fmix(h1); +} |