source: trunk/symbol_table/src/hash_strategy.hpp @ 2092

Last change on this file since 2092 was 2092, checked in by ksherdy, 7 years ago

Refactored id,div2,log2. All tests pass.

File size: 4.3 KB
Line 
1#ifndef HASH_STRATEGY_HPP
2#define HASH_STRATEGY_HPP
3
4#include "types.hpp"
5
6#define MAX_HASH_BITS 17 // Maximum length specific hash_strategy
7
8
9///////////////////////////////////////////////////////////////////////////////
10// Hash Strategy Interface
11///////////////////////////////////////////////////////////////////////////////
12class ihash_strategy {
13public:
14    static IDISA_ALWAYS_INLINE uint64_t hash(const uint8_t * h0, const uint8_t * h1, const int32_t idx, const uint32_t slice_bits, const uint32_t hash_bits);
15    static IDISA_ALWAYS_INLINE uint32_t max_hashsize();
16protected:
17    ihash_strategy() {}
18};
19
20///////////////////////////////////////////////////////////////////////////////
21// Hash Strategy templated on LGTH, GROUP, SCALE FACTOR (BIT vs. BYTE)
22///////////////////////////////////////////////////////////////////////////////
23template<uint32_t LGTH, int GROUP_STRATEGY, int SCALE_FACTOR>
24class hash_strategy_t: public ihash_strategy {
25public:
26    static IDISA_ALWAYS_INLINE uint64_t hash(const uint8_t * h0, const uint8_t * h1, const int32_t idx, const uint32_t slice_bits, const uint32_t hash_bits);
27    static IDISA_ALWAYS_INLINE uint32_t max_hashsize();
28};
29
30///////////////////////////////////////////////////////////////////////////////
31// Identity - Default Case - Length 0 specialized for length > 16.
32///////////////////////////////////////////////////////////////////////////////
33template<int SCALE_FACTOR> class hash_strategy_t<0,id,SCALE_FACTOR> {
34public:
35    static IDISA_ALWAYS_INLINE uint64_t hash(const uint8_t * h0, const uint8_t * h1, const int32_t idx, const uint32_t slice_bits, const uint32_t hash_bits) {
36        return bit_compress_hash(h0, h1, idx*SCALE_FACTOR, slice_bits, hash_bits); // expect h0 as hash bit stream
37    }
38    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return MAX_HASH_BITS; }
39};
40
41///////////////////////////////////////////////////////////////////////////////
42// Identity - Length 1 specialized.
43///////////////////////////////////////////////////////////////////////////////
44template<int SCALE_FACTOR> class hash_strategy_t<1,id,SCALE_FACTOR> {
45public:
46    static IDISA_ALWAYS_INLINE uint64_t hash(const uint8_t * h0, const uint8_t * h1, const int32_t idx, const uint32_t slice_bits, const uint32_t hash_bits) {
47        return h0[idx];
48    }
49    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(1); }
50};
51
52template<uint32_t LGTH, int SCALE_FACTOR> class hash_strategy_t<LGTH,id,SCALE_FACTOR> {
53public:
54    static IDISA_ALWAYS_INLINE uint64_t hash(const uint8_t * h0, const uint8_t * h1, const int32_t idx, const uint32_t slice_bits, const uint32_t hash_bits) {
55        return bit_compress_hash(h0, h1, idx*SCALE_FACTOR, slice_bits, hash_bits);
56    }
57    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return LGTH*SCALE_FACTOR; }
58};
59
60///////////////////////////////////////////////////////////////////////////////
61// Bit Space / Byte Space - div2 == id WTE bit/byte boundardy.
62///////////////////////////////////////////////////////////////////////////////
63template<uint32_t LGTH, int SCALE_FACTOR> class hash_strategy_t<LGTH,div2,SCALE_FACTOR>: public hash_strategy_t<LGTH,id,SCALE_FACTOR>{};
64
65template<int SCALE_FACTOR> class hash_strategy_t<7,div2,SCALE_FACTOR> {
66    public:
67        static IDISA_ALWAYS_INLINE uint64_t hash(const uint8_t * h0, const uint8_t * h1, const int32_t idx, const uint32_t slice_bits, const uint32_t hash_bits) {
68        return bit_compress_hash(h0, h1, idx*SCALE_FACTOR, slice_bits, hash_bits);
69        }
70        static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 7*SCALE_FACTOR; }
71    };
72
73/////////////////////////////////////////////////////////////////////////////////
74// Log base 2
75/////////////////////////////////////////////////////////////////////////////////
76template<int SCALE_FACTOR> class hash_strategy_t<1,logbase2,SCALE_FACTOR> : public hash_strategy_t<1,id,SCALE_FACTOR>{};
77template<int SCALE_FACTOR> class hash_strategy_t<2,logbase2,SCALE_FACTOR> : public hash_strategy_t<2,id,SCALE_FACTOR>{};
78template<int SCALE_FACTOR> class hash_strategy_t<4,logbase2,SCALE_FACTOR> : public hash_strategy_t<3,id,SCALE_FACTOR>{};
79template<int SCALE_FACTOR> class hash_strategy_t<8,logbase2,SCALE_FACTOR> : public hash_strategy_t<5,id,SCALE_FACTOR>{};
80template<int SCALE_FACTOR> class hash_strategy_t<16,logbase2,SCALE_FACTOR> : public hash_strategy_t<9,id,SCALE_FACTOR>{};
81
82#endif // HASH_STRATEGY_HPP
Note: See TracBrowser for help on using the repository browser.