Home | History | Annotate | Download | only in rappor
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "components/rappor/bloom_filter.h"
      6 
      7 #include "base/logging.h"
      8 #include "third_party/smhasher/src/City.h"
      9 
     10 namespace rappor {
     11 
     12 BloomFilter::BloomFilter(uint32_t bytes_size,
     13                          uint32_t hash_function_count,
     14                          uint32_t hash_seed_offset)
     15     : bytes_(bytes_size),
     16       hash_function_count_(hash_function_count),
     17       hash_seed_offset_(hash_seed_offset) {
     18   DCHECK_GT(bytes_size, 0u);
     19 }
     20 
     21 BloomFilter::~BloomFilter() {}
     22 
     23 void BloomFilter::SetString(const std::string& str) {
     24   for (size_t i = 0; i < bytes_.size(); ++i) {
     25     bytes_[i] = 0;
     26   }
     27   for (size_t i = 0; i < hash_function_count_; ++i) {
     28     // Using CityHash here because we have support for it in Dremel.  Many hash
     29     // functions, such as MD5, SHA1, or Murmur, would probably also work.
     30     uint32_t index =
     31         CityHash64WithSeed(str.data(), str.size(), hash_seed_offset_ + i);
     32     // Note that the "bytes" are uint8_t, so they are always 8-bits.
     33     uint32_t byte_index = (index / 8) % bytes_.size();
     34     uint32_t bit_index = index % 8;
     35     bytes_[byte_index] |= 1 << bit_index;
     36   }
     37 }
     38 
     39 void BloomFilter::SetBytesForTesting(const ByteVector& bytes) {
     40   DCHECK_EQ(bytes_.size(), bytes.size());
     41   for (size_t i = 0; i < bytes_.size(); ++i) {
     42     bytes_[i] = bytes[i];
     43   }
     44 }
     45 
     46 }  // namespace rappor
     47