[thin_show_dups] switch to boost::circular_buffer in the rolling_hash
This commit is contained in:
parent
506b0a8a08
commit
3b96812328
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user