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();
 | 
						|
}
 | 
						|
 | 
						|
//----------------------------------------------------------------
 |