| Index: chrome/common/metrics/entropy_provider.h
|
| ===================================================================
|
| --- chrome/common/metrics/entropy_provider.h (revision 0)
|
| +++ chrome/common/metrics/entropy_provider.h (revision 0)
|
| @@ -0,0 +1,95 @@
|
| +// Copyright (c) 2012 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 CHROME_COMMON_METRICS_ENTROPY_PROVIDER_H_
|
| +#define CHROME_COMMON_METRICS_ENTROPY_PROVIDER_H_
|
| +
|
| +#include <functional>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/base_export.h"
|
| +#include "base/basictypes.h"
|
| +#include "base/compiler_specific.h"
|
| +#include "base/metrics/field_trial.h"
|
| +#include "third_party/mt19937ar/mt19937ar.h"
|
| +
|
| +namespace metrics {
|
| +
|
| +// Internals of entropy_provider.cc exposed for testing.
|
| +namespace internal {
|
| +
|
| +// A functor that generates random numbers based on a seed, using the Mersenne
|
| +// Twister algorithm. Suitable for use with std::random_shuffle().
|
| +struct SeededRandGenerator : std::unary_function<uint32, uint32> {
|
| + explicit SeededRandGenerator(uint32 seed);
|
| + ~SeededRandGenerator();
|
| +
|
| + // Returns a random number in range [0, range).
|
| + uint32 operator()(uint32 range);
|
| +
|
| + MersenneTwister mersenne_twister_;
|
| +};
|
| +
|
| +// Creates unique identifier for the trial by hashing a name string, whether
|
| +// it's for the field trial or the group name.
|
| +// TODO(asvitkine): Share the implementation with variations_util.cc.
|
| +uint32 HashName(const std::string& name);
|
| +
|
| +// Fills |mapping| to create a bijection of values in the range of
|
| +// [0, |mapping.size()|), permuted based on |trial_name|.
|
| +void PermuteMappingUsingTrialName(const std::string& trial_name,
|
| + std::vector<uint16>* mapping);
|
| +
|
| +} // namespace internal
|
| +
|
| +// SHA1EntropyProvider is an entropy provider suitable for high entropy
|
| +// sources. It works by taking the first 64 bits of the SHA1 hash of the
|
| +// entropy source concatenated with the trial name and using that for the
|
| +// final entropy value.
|
| +class SHA1EntropyProvider : public base::FieldTrial::EntropyProvider {
|
| + public:
|
| + // Creates a SHA1EntropyProvider with the given |entropy_source|, which
|
| + // should contain a large amount of entropy - for example, a textual
|
| + // representation of a persistent randomly-generated 128-bit value.
|
| + explicit SHA1EntropyProvider(const std::string& entropy_source);
|
| + virtual ~SHA1EntropyProvider();
|
| +
|
| + // base::FieldTrial::EntropyProvider implementation:
|
| + virtual double GetEntropyForTrial(const std::string& trial_name) const
|
| + OVERRIDE;
|
| +
|
| + private:
|
| + std::string entropy_source_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SHA1EntropyProvider);
|
| +};
|
| +
|
| +// PermutedEntropyProvider is an entropy provider suitable for low entropy
|
| +// sources (below 16 bits). It uses the field trial name to generate a
|
| +// permutation of a mapping array from an initial entropy value to a new value.
|
| +// Note: This provider's performance is O(2^n), where n is the number of bits
|
| +// in the entropy source.
|
| +class PermutedEntropyProvider : public base::FieldTrial::EntropyProvider {
|
| + public:
|
| + // Creates a PermutedEntropyProvider with the given |low_entropy_source|,
|
| + // which should have a value in the range of [0, low_entropy_source_max).
|
| + PermutedEntropyProvider(uint16 low_entropy_source,
|
| + size_t low_entropy_source_max);
|
| + virtual ~PermutedEntropyProvider();
|
| +
|
| + // base::FieldTrial::EntropyProvider implementation:
|
| + virtual double GetEntropyForTrial(const std::string& trial_name) const
|
| + OVERRIDE;
|
| +
|
| + private:
|
| + uint16 low_entropy_source_;
|
| + size_t low_entropy_source_max_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PermutedEntropyProvider);
|
| +};
|
| +
|
| +} // namespace metrics
|
| +
|
| +#endif // CHROME_COMMON_METRICS_ENTROPY_PROVIDER_H_
|
|
|