[thin_show_dups] switch to boost::circular_buffer in the rolling_hash

This commit is contained in:
Joe Thornber 2015-09-04 11:28:33 +01:00
parent 506b0a8a08
commit 3b96812328
2 changed files with 9 additions and 10 deletions

View File

@ -10,7 +10,8 @@ using namespace std;
rolling_hash::rolling_hash(unsigned window_size) rolling_hash::rolling_hash(unsigned window_size)
: a_(MULTIPLIER), : a_(MULTIPLIER),
a_to_k_minus_1_(a_), a_to_k_minus_1_(a_),
window_size_(window_size) { window_size_(window_size),
buffer_(window_size) {
for (unsigned i = 1; i < window_size_ - 1; i++) for (unsigned i = 1; i < window_size_ - 1; i++)
a_to_k_minus_1_ *= a_; a_to_k_minus_1_ *= a_;
@ -22,12 +23,12 @@ void
rolling_hash::reset() rolling_hash::reset()
{ {
// prime with zeroes // prime with zeroes
chars_.clear(); buffer_.clear();
hash_ = 0; hash_ = 0;
for (unsigned i = 0; i < window_size_; i++) { for (unsigned i = 0; i < window_size_; i++) {
hash_ = (hash_ * a_) + SEED; hash_ = (hash_ * a_) + SEED;
chars_.push_back(0); buffer_.push_back(0);
} }
} }

View File

@ -1,7 +1,7 @@
#ifndef BASE_ROLLING_HASH_H #ifndef BASE_ROLLING_HASH_H
#define BASE_ROLLING_HASH_H #define BASE_ROLLING_HASH_H
#include <list> #include <boost/circular_buffer.hpp>
#include <stdint.h> #include <stdint.h>
#include <boost/optional.hpp> #include <boost/optional.hpp>
@ -31,20 +31,18 @@ namespace base {
private: private:
void update_hash(uint8_t byte) { void update_hash(uint8_t byte) {
hash_ -= a_to_k_minus_1_ * (chars_.front() + hash_detail::SEED); hash_ -= a_to_k_minus_1_ * (buffer_.front() + hash_detail::SEED);
chars_.pop_front(); buffer_.push_back(byte);
chars_.push_back(byte);
hash_ = (hash_ * a_) + byte + hash_detail::SEED; hash_ = (hash_ * a_) + byte + hash_detail::SEED;
} }
uint32_t a_; uint32_t a_;
uint32_t a_to_k_minus_1_; uint32_t a_to_k_minus_1_;
// FIXME: use a ring buffer
std::list<uint8_t> chars_;
uint32_t hash_; uint32_t hash_;
uint32_t window_size_; uint32_t window_size_;
boost::circular_buffer<uint8_t> buffer_;
}; };
class content_based_hash { class content_based_hash {