Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/vowpal_wabbit.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorariel faigon <ariel.git@yendor.com>2012-08-14 07:13:42 +0400
committerariel faigon <ariel.git@yendor.com>2012-08-14 07:13:42 +0400
commitd2133035e1d558b926fdf9255d0533ede777e436 (patch)
treeaf1ecd024c71a8ce8c30881a5b04ccb7fa18ba75 /vowpalwabbit/hash.cc
parent40ffdb5f9c325ff177e328f03c5711212ec94172 (diff)
hash.cc: improve readability & style
Diffstat (limited to 'vowpalwabbit/hash.cc')
-rw-r--r--vowpalwabbit/hash.cc126
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);
+}