58 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "base/rolling_hash.h"
 | |
| 
 | |
| using namespace base;
 | |
| using namespace boost;
 | |
| using namespace hash_detail;
 | |
| using namespace std;
 | |
| 
 | |
| //----------------------------------------------------------------
 | |
| 
 | |
| rolling_hash::rolling_hash(unsigned window_size)
 | |
| 	: a_(MULTIPLIER),
 | |
| 	  a_to_k_minus_1_(a_),
 | |
| 	  window_size_(window_size),
 | |
| 	  buffer_(window_size) {
 | |
| 
 | |
| 	for (unsigned i = 1; i < window_size_ - 1; i++)
 | |
| 		a_to_k_minus_1_ *= a_;
 | |
| 
 | |
| 	reset();
 | |
| }
 | |
| 
 | |
| void
 | |
| rolling_hash::reset()
 | |
| {
 | |
| 	// prime with zeroes
 | |
| 	buffer_.clear();
 | |
| 
 | |
| 	hash_ = 0;
 | |
| 	for (unsigned i = 0; i < window_size_; i++) {
 | |
| 		hash_ = (hash_ * a_) + SEED;
 | |
| 		buffer_.push_back(0);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //--------------------------------
 | |
| 
 | |
| content_based_hash::content_based_hash(unsigned window_size)
 | |
| 	: rhash_(window_size),
 | |
| 
 | |
| 	  // FIXME: hard coded values
 | |
| 	  backup_div_((window_size / 4) - 1),
 | |
| 	  div_((window_size / 2) - 1),
 | |
| 	  min_len_(window_size / 4),
 | |
| 	  max_len_(window_size),
 | |
| 	  len_(0)
 | |
| {
 | |
| }
 | |
| 
 | |
| void
 | |
| content_based_hash::reset()
 | |
| {
 | |
| 	len_ = 0;
 | |
| 	backup_break_.reset();
 | |
| 	rhash_.reset();
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------
 |