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

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

Specialized on LGTH.

File size: 8.0 KB
Line 
1#ifndef HASH_STRATEGY_HPP
2#define HASH_STRATEGY_HPP
3
4#define MAX_HASH_BITS 17 // maximum length specific hash_strategy
5
6/* Hash Strategy */
7class hash_strategy {
8public:
9    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);
10    static IDISA_ALWAYS_INLINE uint32_t max_hashsize();
11protected:
12    hash_strategy() {}
13};
14
15/* Hash functions specialized on symbol length. */
16template<uint32_t LGTH>
17class hash_strategy_t: public hash_strategy {
18public:
19    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);
20    static IDISA_ALWAYS_INLINE uint32_t max_hashsize();
21};
22
23/* Default */
24///////////////////////////////////////////////////////////////////////////////
25// Bit Space Hash
26///////////////////////////////////////////////////////////////////////////////
27template<> class hash_strategy_t<0> {
28public:
29    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) {
30        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits); // expect h0 as hash bit stream
31    }
32    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return MAX_HASH_BITS; }
33};
34
35///////////////////////////////////////////////////////////////////////////////
36// Byte Space Hash
37///////////////////////////////////////////////////////////////////////////////
38template<> class hash_strategy_t<1> {
39public:
40    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) {
41        return h0[idx];
42    }
43    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(1); }
44};
45
46template<> class hash_strategy_t<2> {
47public:
48    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) {
49        return bit_compress_hash(h0, h1, bytes2bits(idx), slice_bits, hash_bits);
50    }
51    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(2); }
52};
53
54template<> class hash_strategy_t<3> {
55public:
56    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) {
57        return bit_compress_hash(h0, h1, bytes2bits(idx), slice_bits, hash_bits);
58    }
59    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(3); }
60};
61
62template<> class hash_strategy_t<4>: public hash_strategy {
63public:
64    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) {
65        return bit_compress_hash(h0, h1, bytes2bits(idx), slice_bits, hash_bits);
66    };
67    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(4); }
68};
69
70template<> class hash_strategy_t<5>: public hash_strategy {
71public:
72    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) {
73        return bit_compress_hash(h0, h1, bytes2bits(idx), slice_bits, hash_bits);
74    };
75    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(5); }
76};
77
78template<> class hash_strategy_t<6>: public hash_strategy {
79public:
80    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) {
81        return bit_compress_hash(h0, h1, bytes2bits(idx), slice_bits, hash_bits);
82    };
83    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(6); }
84};
85
86template<> class hash_strategy_t<7>: public hash_strategy {
87public:
88    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) {
89        return bit_compress_hash(h0, h1, bytes2bits(idx), slice_bits, hash_bits);
90    };
91    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return bytes2bits(7); }
92};
93
94///////////////////////////////////////////////////////////////////////////////
95// Bit Space Hash
96///////////////////////////////////////////////////////////////////////////////
97template<> class hash_strategy_t<8>: public hash_strategy {
98public:
99    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) {
100        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
101    };
102    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 8; }
103};
104
105template<> class hash_strategy_t<9>: public hash_strategy {
106public:
107    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) {
108        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
109    };
110    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 9; }
111};
112
113template<> class hash_strategy_t<10>: public hash_strategy {
114public:
115    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) {
116        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
117    };
118    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 10; }
119};
120
121template<> class hash_strategy_t<11>: public hash_strategy {
122public:
123    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) {
124        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
125    };
126    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 11; }
127};
128
129template<> class hash_strategy_t<12>: public hash_strategy {
130public:
131    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) {
132        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
133    };
134    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 12; }
135};
136
137template<> class hash_strategy_t<13>: public hash_strategy {
138public:
139    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) {
140        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
141    };
142    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 13; }
143};
144
145template<> class hash_strategy_t<14>: public hash_strategy {
146public:
147    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) {
148        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
149    };
150    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 14; }
151};
152
153template<> class hash_strategy_t<15>: public hash_strategy {
154public:
155    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) {
156        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
157    };
158    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 15; }
159};
160
161template<> class hash_strategy_t<16>: public hash_strategy {
162public:
163    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) {
164        return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits);
165    };
166    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return 16; }
167};
168
169///* Default */
170//class hash_strategy_d: public hash_strategy {
171//public:
172//    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) {
173//      return bit_compress_hash(h0, h1, idx, slice_bits, hash_bits); // expect h0 as hash bit stream
174//    }
175//    static IDISA_ALWAYS_INLINE uint32_t max_hashsize() { return MAX_HASH_BITS; }
176//};
177
178#endif // HASH_STRATEGY_HPP
Note: See TracBrowser for help on using the repository browser.