Flex  0.17.9
single_phf_view.h
Go to the documentation of this file.
1 
16 #ifndef GRAPHSCOPE_PTHASH_UTILS_SINGLE_PHF_VIEW_H_
17 #define GRAPHSCOPE_PTHASH_UTILS_SINGLE_PHF_VIEW_H_
18 
19 #ifdef USE_PTHASH
20 
21 #include "flex/utils/mmap_array.h"
23 #include "utils/bucketers.hpp"
24 #include "utils/hasher.hpp"
25 
26 namespace gs {
27 
28 struct default_loader {
29  default_loader(const char* buffer) : buffer_(buffer) {}
30  ~default_loader() = default;
31 
32  template <typename T>
33  void visit(T& val) {
34  if constexpr (std::is_pod<T>::value) {
35  memcpy(&val, buffer_, sizeof(T));
36  buffer_ += sizeof(T);
37  } else {
38  val.visit(*this);
39  }
40  }
41 
42  template <typename T>
43  void visit_vec(ref_vector<T>& vec) {
44  size_t size;
45  visit(size);
46  vec.init(reinterpret_cast<const T*>(buffer_), size);
47  buffer_ += sizeof(T) * size;
48  }
49 
50  const char* buffer() const { return buffer_; }
51 
52  private:
53  const char* buffer_;
54 };
55 
56 // This code is an adaptation from
57 // https://github.com/jermp/pthash/blob/master/include/single_phf.hpp
58 template <typename Hasher>
59 struct SinglePHFView {
60  public:
61  SinglePHFView() = default;
62  ~SinglePHFView() = default;
63 
64  SinglePHFView(const SinglePHFView& rhs) : buffer_(rhs.buffer_) {
65  default_loader loader(buffer_.data());
66  loader.visit(m_seed);
67  loader.visit(m_num_keys);
68  loader.visit(m_table_size);
69  loader.visit(m_M);
70  loader.visit(m_bucketer);
71  loader.visit(m_pilots);
72  loader.visit(m_free_slots);
73  }
74 
75  void Open(const std::string& filename) {
76  buffer_.open(filename);
77  default_loader loader(buffer_.data());
78  loader.visit(m_seed);
79  loader.visit(m_num_keys);
80  loader.visit(m_table_size);
81  loader.visit(m_M);
82  loader.visit(m_bucketer);
83  loader.visit(m_pilots);
84  loader.visit(m_free_slots);
85  }
86 
87  void Init(const std::vector<char>& buffer) {
88  buffer_.resize(buffer.size());
89  memcpy(buffer_.data(), buffer.data(), buffer.size());
90  default_loader loader(buffer_.data());
91  loader.visit(m_seed);
92  loader.visit(m_num_keys);
93  loader.visit(m_table_size);
94  loader.visit(m_M);
95  loader.visit(m_bucketer);
96  loader.visit(m_pilots);
97  loader.visit(m_free_slots);
98  }
99 
100  void Save(const std::string& filename) { buffer_.dump(filename); }
101 
102  template <typename T>
103  uint64_t operator()(T const& key) const {
104  auto hash = Hasher::hash(key, m_seed);
105  return position(hash);
106  }
107 
108  uint64_t position(typename Hasher::hash_type hash) const {
109  uint64_t bucket = m_bucketer.bucket(hash.first());
110  uint64_t pilot = m_pilots.access(bucket);
111  uint64_t hashed_pilot = pthash::default_hash64(pilot, m_seed);
112  uint64_t p =
113  fastmod::fastmod_u64(hash.second() ^ hashed_pilot, m_M, m_table_size);
114  if (PTHASH_LIKELY(p < m_num_keys))
115  return p;
116  return m_free_slots.access(p - m_num_keys);
117  }
118 
119  private:
120  uint64_t m_seed;
121  uint64_t m_num_keys;
122  uint64_t m_table_size;
123  __uint128_t m_M;
124  pthash::skew_bucketer m_bucketer;
125  dual_dictionary_view m_pilots;
126  ef_sequence_view m_free_slots;
127  mmap_array<char> buffer_;
128 };
129 
130 } // namespace gs
131 
132 #endif // USE_PTHASH
133 
134 #endif // GRAPHSCOPE_PTHASH_UTILS_SINGLE_PHF_VIEW_H_
gs
Definition: adj_list.h:23
encoders_view.h
mmap_array.h