| Index: components/rappor/rappor_metric.cc
|
| diff --git a/components/rappor/rappor_metric.cc b/components/rappor/rappor_metric.cc
|
| index 862ead8933a0612026378722dca0abeab8398242..b983cf20d761fb9ebc7181576487d7322b16f25b 100644
|
| --- a/components/rappor/rappor_metric.cc
|
| +++ b/components/rappor/rappor_metric.cc
|
| @@ -6,34 +6,26 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/rand_util.h"
|
| +#include "components/rappor/bloom_filter.h"
|
|
|
| namespace rappor {
|
|
|
| RapporMetric::RapporMetric(const std::string& metric_name,
|
| - const RapporParameters& parameters,
|
| - int32_t cohort_seed)
|
| + const RapporParameters& parameters)
|
| : metric_name_(metric_name),
|
| parameters_(parameters),
|
| sample_count_(0),
|
| - bloom_filter_(parameters.bloom_filter_size_bytes,
|
| - parameters.bloom_filter_hash_function_count,
|
| - (cohort_seed % parameters.num_cohorts) *
|
| - parameters.bloom_filter_hash_function_count) {
|
| - DCHECK_GE(cohort_seed, 0);
|
| - DCHECK_LT(cohort_seed, RapporParameters::kMaxCohorts);
|
| - // Since cohort_seed is in the range [0, kMaxCohorts), num_cohorts should
|
| - // divide kMaxCohorts for each cohort to have equal weight.
|
| - DCHECK_EQ(0, RapporParameters::kMaxCohorts % parameters.num_cohorts);
|
| + sample_(parameters.bloom_filter_size_bytes + parameters.flag_bytes) {
|
| }
|
|
|
| RapporMetric::~RapporMetric() {}
|
|
|
| -void RapporMetric::AddSample(const std::string& str) {
|
| +void RapporMetric::AddSample(const Sample& sample) {
|
| ++sample_count_;
|
| // Replace the previous sample with a 1 in sample_count_ chance so that each
|
| // sample has equal probability of being reported.
|
| if (base::RandGenerator(sample_count_) == 0) {
|
| - bloom_filter_.SetString(str);
|
| + sample_ = sample;
|
| }
|
| }
|
|
|
| @@ -69,8 +61,29 @@ ByteVector RapporMetric::GetReport(const std::string& secret) const {
|
| return *ByteVectorMerge(*fake_and_redacted_bits, zero_coins, &one_coins);
|
| }
|
|
|
| -void RapporMetric::SetBytesForTesting(const ByteVector& bytes) {
|
| - bloom_filter_.SetBytesForTesting(bytes);
|
| +void RapporMetric::SetSampleForTesting(const Sample& sample) {
|
| + sample_ = sample;
|
| +}
|
| +
|
| +void SetSampleBits(const RapporParameters& parameters, int32_t cohort_seed,
|
| + const std::string& str, uint64_t flags, Sample* output) {
|
| + DCHECK_GE(cohort_seed, 0);
|
| + DCHECK_LT(cohort_seed, RapporParameters::kMaxCohorts);
|
| + // Since cohort_seed is in the range [0, kMaxCohorts), num_cohorts should
|
| + // divide kMaxCohorts for each cohort to have equal weight.
|
| + DCHECK_EQ(0, RapporParameters::kMaxCohorts % parameters.num_cohorts);
|
| + output->resize(parameters.bloom_filter_size_bytes + parameters.flag_bytes);
|
| + internal::SetBloomBits(parameters.bloom_filter_size_bytes,
|
| + parameters.bloom_filter_hash_function_count,
|
| + (cohort_seed % parameters.num_cohorts) *
|
| + parameters.bloom_filter_hash_function_count,
|
| + str,
|
| + output);
|
| + DCHECK_EQ(0ul, flags >> (parameters.flag_bytes * 8));
|
| + for(int i = 0; i < parameters.flag_bytes; i++) {
|
| + uint8_t flag_byte = (flags >> (i * 8)) % (1 << 8);
|
| + (*output)[parameters.bloom_filter_size_bytes + i] = flag_byte;
|
| + }
|
| }
|
|
|
| } // namespace rappor
|
|
|