diff --git a/libconfluo/confluo/container/sketch/confluo_universal_sketch.h b/libconfluo/confluo/container/sketch/confluo_universal_sketch.h index ac9a4ea61..ab16a4130 100644 --- a/libconfluo/confluo/container/sketch/confluo_universal_sketch.h +++ b/libconfluo/confluo/container/sketch/confluo_universal_sketch.h @@ -364,7 +364,7 @@ class confluo_universal_sketch { } std::vector> substream_summaries_; - hash_manager layer_hashes_; + hash_manager layer_hashes_; schema_t schema_; column_t column_; diff --git a/libconfluo/confluo/container/sketch/count_sketch.h b/libconfluo/confluo/container/sketch/count_sketch.h index f3be7b3ad..c69fe1196 100644 --- a/libconfluo/confluo/container/sketch/count_sketch.h +++ b/libconfluo/confluo/container/sketch/count_sketch.h @@ -167,8 +167,8 @@ class count_sketch { size_t width_; // number of buckets std::vector counters_; - hash_manager bucket_hash_manager_; - hash_manager sign_hash_manager_; + hash_manager bucket_hash_manager_; + hash_manager sign_hash_manager_; }; diff --git a/libconfluo/confluo/container/sketch/hash_manager.h b/libconfluo/confluo/container/sketch/hash_manager.h index 04fa98aad..f7ed9122f 100644 --- a/libconfluo/confluo/container/sketch/hash_manager.h +++ b/libconfluo/confluo/container/sketch/hash_manager.h @@ -13,16 +13,11 @@ namespace sketch { class pairwise_indep_hash { public: - static const size_t PRIME = 39916801UL; + static const size_t PRIME; - pairwise_indep_hash() - : pairwise_indep_hash(0, 0) { - } + pairwise_indep_hash(); - pairwise_indep_hash(size_t a, size_t b) - : a_(a), - b_(b) { - } + pairwise_indep_hash(size_t a, size_t b); template size_t apply(T elem) const { @@ -35,40 +30,27 @@ class pairwise_indep_hash { return (a_ * elem + b_) % PRIME; } - static pairwise_indep_hash generate_random() { - return { utils::rand_utils::rand_uint64(PRIME), utils::rand_utils::rand_uint64(PRIME) }; - } + static pairwise_indep_hash generate_random(); private: size_t a_, b_; }; -const size_t pairwise_indep_hash::PRIME; - -template class hash_manager { public: + /** * Constructor. * @param num_hashes number of hashes */ - hash_manager(size_t num_hashes = 0) - : hashes_() { - this->guarantee_initialized(num_hashes); - } + explicit hash_manager(size_t num_hashes = 0); /** * Guarantee enough hashes are intialized. * @param num_hashes number of hashes */ - void guarantee_initialized(size_t num_hashes) { - size_t cur_size = hashes_.size(); - size_t num_new_hashes = num_hashes > cur_size ? num_hashes - cur_size : 0; - for (size_t i = 0; i < num_new_hashes; i++) { - hashes_.push_back(pairwise_indep_hash::generate_random()); - } - } + void guarantee_initialized(size_t num_hashes); /** * Hash element. @@ -76,6 +58,7 @@ class hash_manager { * @param elem element to hash * @return hashed value */ + template size_t hash(size_t hash_id, T elem) const { return hashes_[hash_id].template apply(elem); } diff --git a/libconfluo/confluo/container/sketch/universal_sketch.h b/libconfluo/confluo/container/sketch/universal_sketch.h index 5924640be..2992a77f1 100644 --- a/libconfluo/confluo/container/sketch/universal_sketch.h +++ b/libconfluo/confluo/container/sketch/universal_sketch.h @@ -363,7 +363,7 @@ class universal_sketch { } std::vector> substream_summaries_; - hash_manager layer_hashes_; + hash_manager layer_hashes_; bool precise_hh_; diff --git a/libconfluo/src/container/sketch/hash_manager.cc b/libconfluo/src/container/sketch/hash_manager.cc new file mode 100644 index 000000000..059bbb4b9 --- /dev/null +++ b/libconfluo/src/container/sketch/hash_manager.cc @@ -0,0 +1,36 @@ +#include "container/sketch/hash_manager.h" + +namespace confluo { +namespace sketch { + +const size_t pairwise_indep_hash::PRIME = 39916801UL; + +pairwise_indep_hash::pairwise_indep_hash() + : pairwise_indep_hash(0, 0) { +} + +pairwise_indep_hash::pairwise_indep_hash(size_t a, size_t b) + : a_(a), + b_(b) { +} + + +pairwise_indep_hash pairwise_indep_hash::generate_random() { + return { utils::rand_utils::rand_uint64(PRIME), utils::rand_utils::rand_uint64(PRIME) }; +} + +hash_manager::hash_manager(size_t num_hashes) + : hashes_() { + this->guarantee_initialized(num_hashes); +} + +void hash_manager::guarantee_initialized(size_t num_hashes) { + size_t cur_size = hashes_.size(); + size_t num_new_hashes = num_hashes > cur_size ? num_hashes - cur_size : 0; + for (size_t i = 0; i < num_new_hashes; i++) { + hashes_.push_back(pairwise_indep_hash::generate_random()); + } +} + +} +}