qid_gen.h 2.82 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.

// qid_gen defines a generator for query id's
//
// We probably want to merge this with the weighted random in the nsas
// (and other parts where we need randomness, perhaps another thing
// for a general libutil?)

21 22
#ifndef __QID_GEN_H
#define __QID_GEN_H
23 24 25 26 27 28 29 30

#include <dns/message.h>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int.hpp>
#include <boost/random/variate_generator.hpp>


namespace asiolink {
31

32 33 34 35 36 37 38 39 40 41 42
/// This class generates Qids for outgoing queries
///
/// It is implemented as a singleton; the public way to access it
/// is to call getInstance()->generateQid().
///
/// It automatically seeds it with the current time when it is first
/// used.
class QidGenerator {
public:
    /// \brief Returns the singleton instance of the QidGenerator
    ///
43 44
    /// Returns a reference to the singleton instance of the generator
    static QidGenerator& getInstance();
45

46
    /// \brief Default constructor
47
    ///
48 49
    /// It is recommended that getInstance is used rather than creating
    /// separate instances of this class.
50
    ///
51 52 53
    /// The constructor automatically seeds the generator with the
    /// current time.
    QidGenerator();
54 55 56 57 58 59 60 61

    /// Generate a Qid
    ///
    /// \return A random Qid
    isc::dns::qid_t generateQid();

    /// \brief Seeds the QidGenerator (based on the current time)
    ///
62
    /// This is automatically called by the constructor
63
    void seed();
64

65
private:
66 67 68 69 70
    // "Mersenne Twister: A 623-dimensionally equidistributed
    // uniform pseudo-random number generator", Makoto Matsumoto and
    // Takuji Nishimura, ACM Transactions on Modeling and Computer
    // Simulation: Special Issue on Uniform Random Number Generation,
    // Vol. 8, No. 1, January 1998, pp. 3-30.
71 72 73 74
    //
    // mt19937 is an implementation of one of the pseudo random
    // generators described in this paper.
    boost::mt19937 generator_;
75

76 77
    // For qid's we want a uniform distribution
    boost::uniform_int<> dist_;
78

79
    boost::variate_generator<boost::mt19937&, boost::uniform_int<> > vgen_;
80 81 82 83 84
};


} // namespace asiolink

85
#endif // __QID_GEN_H