Files
backup/src/chunkers/srcs/Buzhash.cpp
2023-06-08 23:57:43 +02:00

35 lines
803 B
C++

//
// Created by Stepan Usatiuk on 26.04.2023.
//
#include "../includes/Buzhash.h"
Buzhash::Buzhash(uint32_t blockSize) : blockSize(blockSize), history() {}
uint32_t Buzhash::get() const {
return cur;
}
uint32_t Buzhash::feed(uint8_t in) {
cur = rotr32(cur, 1);
if (history.size() >= blockSize) {
auto oldest = history.back();
history.pop_back();
cur ^= rotr32(randomNumbers[oldest], blockSize);
}
history.emplace_front(in);
cur ^= randomNumbers[in];
return cur;
}
// Circular shift taken from: https://en.wikipedia.org/wiki/Circular_shift
uint32_t Buzhash::rotr32(uint32_t value, unsigned int count) {
const unsigned int mask = CHAR_BIT * sizeof(value) - 1;
count &= mask;
return (value >> count) | (value << (-count & mask));
}