[thin_show_dups] variable_chunk_stream
This commit is contained in:
61
base/rolling_hash.h
Normal file
61
base/rolling_hash.h
Normal file
@@ -0,0 +1,61 @@
|
||||
#ifndef BASE_ROLLING_HASH_H
|
||||
#define BASE_ROLLING_HASH_H
|
||||
|
||||
#include <list>
|
||||
#include <stdint.h>
|
||||
#include <boost/optional.hpp>
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
namespace base {
|
||||
class rolling_hash {
|
||||
public:
|
||||
rolling_hash(unsigned window_size);
|
||||
|
||||
void reset();
|
||||
|
||||
// Returns the current hash
|
||||
uint32_t step(uint8_t byte);
|
||||
|
||||
uint32_t get_hash() const;
|
||||
|
||||
private:
|
||||
void update_hash(uint8_t byte);
|
||||
|
||||
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_;
|
||||
};
|
||||
|
||||
class content_based_hash {
|
||||
public:
|
||||
content_based_hash(unsigned window_size);
|
||||
void reset();
|
||||
|
||||
// Returns a break point relative to the last reset/break.
|
||||
boost::optional<unsigned> step(uint8_t byte);
|
||||
|
||||
private:
|
||||
bool hit_break(uint32_t div) const;
|
||||
|
||||
rolling_hash rhash_;
|
||||
|
||||
uint32_t backup_div_;
|
||||
uint32_t div_;
|
||||
|
||||
unsigned min_len_;
|
||||
unsigned max_len_;
|
||||
|
||||
unsigned len_;
|
||||
boost::optional<unsigned> backup_break_;
|
||||
};
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user