blob: 54eab71c51dbddaea32ed4f60072a5449be68db6 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/algorithms/experimental/count_min.h"
#include <iostream>
#include "src/algorithms/experimental/hash.h"
#include "src/logging.h"
namespace cobalt {
CountMin::CountMin(size_t num_cells, size_t num_hashes)
: num_cells_(num_cells), num_hashes_(num_hashes), cells_(num_cells * num_hashes, 0u) {}
CountMin::CountMin(size_t num_cells, size_t num_hashes, std::vector<uint32_t> cells)
: num_cells_(num_cells), num_hashes_(num_hashes), cells_(std::move(cells)) {
CHECK_EQ(cells_.size(), num_cells_ * num_hashes_);
}
void CountMin::Increment(const char* data, size_t len, uint32_t num) {
for (size_t i = 0; i < num_hashes_; ++i) {
cells_[GetSketchCell(data, len, i)] += num;
}
}
void CountMin::Increment(const char* data, size_t len) { Increment(data, len, 1); }
void CountMin::Increment(const std::string& data, uint32_t num) {
Increment(data.data(), data.size(), num);
}
void CountMin::Increment(const std::string& data) { Increment(data.data(), data.size(), 1); }
uint32_t CountMin::GetCount(const std::string& data) const {
return GetCount(data.data(), data.size());
}
uint32_t CountMin::GetCount(const char* data, size_t len) const {
uint32_t min_count = 0;
for (size_t i = 0; i < num_hashes_; ++i) {
uint32_t count = cells_[GetSketchCell(data, len, i)];
if (count < min_count || i == 0) {
min_count = count;
}
}
return min_count;
}
const std::vector<uint32_t>* CountMin::GetSketch() const { return &cells_; }
size_t CountMin::GetSketchCell(const char* data, size_t len, uint64_t index) const {
return index * num_cells_ +
TruncatedDigest(reinterpret_cast<const uint8_t*>(data), len, index, num_hashes_);
}
} // namespace cobalt