| Index: components/rappor/bloom_filter.cc
|
| diff --git a/components/rappor/bloom_filter.cc b/components/rappor/bloom_filter.cc
|
| index 9ad8f3ca0ce9d68191e8896229dbf3d44c2e1fcc..6c6f65409151fa37f089a9bf86c4ea756c418756 100644
|
| --- a/components/rappor/bloom_filter.cc
|
| +++ b/components/rappor/bloom_filter.cc
|
| @@ -9,6 +9,16 @@
|
|
|
| namespace rappor {
|
|
|
| +namespace {
|
| +
|
| +uint32_t ComputeHash(const std::string& str, uint32_t seed) {
|
| + // Using CityHash here because we have support for it in Dremel. Many hash
|
| + // functions, such as MD5, SHA1, or Murmur, would probably also work.
|
| + return CityHash64WithSeed(str.data(), str.size(), seed);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| BloomFilter::BloomFilter(uint32_t bytes_size,
|
| uint32_t hash_function_count,
|
| uint32_t hash_seed_offset)
|
| @@ -25,10 +35,7 @@ void BloomFilter::SetString(const std::string& str) {
|
| bytes_[i] = 0;
|
| }
|
| for (size_t i = 0; i < hash_function_count_; ++i) {
|
| - // Using CityHash here because we have support for it in Dremel. Many hash
|
| - // functions, such as MD5, SHA1, or Murmur, would probably also work.
|
| - uint32_t index =
|
| - CityHash64WithSeed(str.data(), str.size(), hash_seed_offset_ + i);
|
| + uint32_t index = ComputeHash(str, hash_seed_offset_ + i);
|
| // Note that the "bytes" are uint8_t, so they are always 8-bits.
|
| uint32_t byte_index = (index / 8) % bytes_.size();
|
| uint32_t bit_index = index % 8;
|
| @@ -43,4 +50,23 @@ void BloomFilter::SetBytesForTesting(const ByteVector& bytes) {
|
| }
|
| }
|
|
|
| +namespace internal {
|
| +
|
| +uint64_t GetBloomBits(uint32_t bytes_size,
|
| + uint32_t hash_function_count,
|
| + uint32_t hash_seed_offset,
|
| + const std::string& str) {
|
| + // Make sure result fits in uint64.
|
| + DCHECK_LE(bytes_size, 8u);
|
| + uint64_t output = 0;
|
| + const uint32_t bits_size = bytes_size * 8;
|
| + for (size_t i = 0; i < hash_function_count; ++i) {
|
| + uint32_t index = ComputeHash(str, hash_seed_offset + i);
|
| + output |= 1ULL << uint64_t(index % bits_size);
|
| + }
|
| + return output;
|
| +}
|
| +
|
| +} // namespace internal
|
| +
|
| } // namespace rappor
|
|
|