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