16 #ifndef GRAPHSCOPE_PTHASH_UTILS_SINGLE_PHF_VIEW_H_
17 #define GRAPHSCOPE_PTHASH_UTILS_SINGLE_PHF_VIEW_H_
23 #include "utils/bucketers.hpp"
24 #include "utils/hasher.hpp"
28 struct default_loader {
29 default_loader(
const char* buffer) : buffer_(buffer) {}
30 ~default_loader() =
default;
34 if constexpr (std::is_pod<T>::value) {
35 memcpy(&val, buffer_,
sizeof(T));
43 void visit_vec(ref_vector<T>& vec) {
46 vec.init(
reinterpret_cast<const T*
>(buffer_), size);
47 buffer_ +=
sizeof(T) * size;
50 const char* buffer()
const {
return buffer_; }
58 template <
typename Hasher>
59 struct SinglePHFView {
61 SinglePHFView() =
default;
62 ~SinglePHFView() =
default;
64 SinglePHFView(
const SinglePHFView& rhs) : buffer_(rhs.buffer_) {
65 default_loader loader(buffer_.data());
67 loader.visit(m_num_keys);
68 loader.visit(m_table_size);
70 loader.visit(m_bucketer);
71 loader.visit(m_pilots);
72 loader.visit(m_free_slots);
75 void Open(
const std::string& filename) {
76 buffer_.open(filename);
77 default_loader loader(buffer_.data());
79 loader.visit(m_num_keys);
80 loader.visit(m_table_size);
82 loader.visit(m_bucketer);
83 loader.visit(m_pilots);
84 loader.visit(m_free_slots);
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());
92 loader.visit(m_num_keys);
93 loader.visit(m_table_size);
95 loader.visit(m_bucketer);
96 loader.visit(m_pilots);
97 loader.visit(m_free_slots);
100 void Save(
const std::string& filename) { buffer_.dump(filename); }
102 template <
typename T>
103 uint64_t operator()(T
const& key)
const {
104 auto hash = Hasher::hash(key, m_seed);
105 return position(hash);
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);
113 fastmod::fastmod_u64(hash.second() ^ hashed_pilot, m_M, m_table_size);
114 if (PTHASH_LIKELY(p < m_num_keys))
116 return m_free_slots.access(p - m_num_keys);
122 uint64_t m_table_size;
124 pthash::skew_bucketer m_bucketer;
125 dual_dictionary_view m_pilots;
126 ef_sequence_view m_free_slots;
127 mmap_array<char> buffer_;
134 #endif // GRAPHSCOPE_PTHASH_UTILS_SINGLE_PHF_VIEW_H_