// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_RAPPOR_BLOOM_FILTER_H_
#define COMPONENTS_RAPPOR_BLOOM_FILTER_H_

#include <stdint.h>

#include <string>

#include "base/macros.h"
#include "components/rappor/byte_vector_utils.h"

namespace rappor {

// BloomFilter is a simple Bloom filter for keeping track of a set of strings.
class BloomFilter {
 public:
  // Constructs a BloomFilter using |bytes_size| bytes of Bloom filter bits,
  // and |hash_function_count| hash functions to set bits in the filter. The
  // hash functions will be generated by using seeds in the range
  // |hash_seed_offset| to (|hash_seed_offset| + |hash_function_count|).
  BloomFilter(size_t bytes_size,
              uint32_t hash_function_count,
              uint32_t hash_seed_offset);
  ~BloomFilter();

  // Sets the Bloom filter bits to contain a single string.
  void SetString(const std::string& str);

  // Returns the current value of the Bloom filter's bit array.
  const ByteVector& bytes() const { return bytes_; };

 private:
  // Stores the byte array of the Bloom filter.
  ByteVector bytes_;

  // The number of bits to set for each string added.
  uint32_t hash_function_count_;

  // A number add to a hash function index to get a seed for that hash function.
  uint32_t hash_seed_offset_;

  DISALLOW_COPY_AND_ASSIGN(BloomFilter);
};


namespace internal {

// A function for getting bloom filters less than or equal to 64 bits.
uint64_t GetBloomBits(size_t bytes_size,
                      uint32_t hash_function_count,
                      uint32_t hash_seed_offset,
                      const std::string& str);

}  // namespace internal

}  // namespace rappor

#endif  // COMPONENTS_RAPPOR_BLOOM_FILTER_H_
