[thin_show_dups] switch to boost::circular_buffer in the rolling_hash
This commit is contained in:
		| @@ -10,7 +10,8 @@ using namespace std; | ||||
| rolling_hash::rolling_hash(unsigned window_size) | ||||
| 	: a_(MULTIPLIER), | ||||
| 	  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++) | ||||
| 		a_to_k_minus_1_ *= a_; | ||||
| @@ -22,12 +23,12 @@ void | ||||
| rolling_hash::reset() | ||||
| { | ||||
| 	// prime with zeroes | ||||
| 	chars_.clear(); | ||||
| 	buffer_.clear(); | ||||
|  | ||||
| 	hash_ = 0; | ||||
| 	for (unsigned i = 0; i < window_size_; i++) { | ||||
| 		hash_ = (hash_ * a_) + SEED; | ||||
| 		chars_.push_back(0); | ||||
| 		buffer_.push_back(0); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #ifndef BASE_ROLLING_HASH_H | ||||
| #define BASE_ROLLING_HASH_H | ||||
|  | ||||
| #include <list> | ||||
| #include <boost/circular_buffer.hpp> | ||||
| #include <stdint.h> | ||||
| #include <boost/optional.hpp> | ||||
|  | ||||
| @@ -31,20 +31,18 @@ namespace base { | ||||
|  | ||||
| 	private: | ||||
| 		void update_hash(uint8_t byte) { | ||||
| 			hash_ -= a_to_k_minus_1_ * (chars_.front() + hash_detail::SEED); | ||||
| 			chars_.pop_front(); | ||||
| 			chars_.push_back(byte); | ||||
| 			hash_ -= a_to_k_minus_1_ * (buffer_.front() + hash_detail::SEED); | ||||
| 			buffer_.push_back(byte); | ||||
| 			hash_ = (hash_ * a_) + byte + hash_detail::SEED; | ||||
| 		} | ||||
|  | ||||
| 		uint32_t a_; | ||||
| 		uint32_t a_to_k_minus_1_; | ||||
|  | ||||
| 		// FIXME: use a ring buffer | ||||
| 		std::list<uint8_t> chars_; | ||||
|  | ||||
| 		uint32_t hash_; | ||||
| 		uint32_t window_size_; | ||||
|  | ||||
| 		boost::circular_buffer<uint8_t> buffer_; | ||||
| 	}; | ||||
|  | ||||
| 	class content_based_hash { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user