Files
blackcoin-more/src/random.h
2018-11-14 20:55:45 +03:00

114 lines
2.7 KiB
C++

// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2014 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_RANDOM_H
#define BITCOIN_RANDOM_H
#include "uint256.h"
#include <stdint.h>
/* Seed OpenSSL PRNG with additional entropy data */
void RandAddSeed();
/**
* Functions to gather random data via the OpenSSL PRNG
*/
void GetRandBytes(unsigned char* buf, int num);
uint64_t GetRand(uint64_t nMax);
int GetRandInt(int nMax);
uint256 GetRandHash();
/**
* Function to gather random data from multiple sources, failing whenever any
* of those source fail to provide a result.
*/
void GetStrongRandBytes(unsigned char* buf, int num);
/**
* Seed insecure_rand using the random pool.
* @param Deterministic Use a deterministic seed
*/
void seed_insecure_rand(bool fDeterministic = false);
/**
* Fast randomness source. This is seeded once with secure random data, but
* is completely deterministic and insecure after that.
* This class is not thread-safe.
*/
class FastRandomContext
{
private:
uint64_t bitbuf;
int bitbuf_size;
void FillBitBuffer()
{
bitbuf = rand64();
bitbuf_size = 64;
}
public:
explicit FastRandomContext(bool fDeterministic = false);
uint32_t Rz;
uint32_t Rw;
uint32_t rand32()
{
Rz = 36969 * (Rz & 65535) + (Rz >> 16);
Rw = 18000 * (Rw & 65535) + (Rw >> 16);
return (Rw << 16) + Rz;
}
uint64_t rand64()
{
uint64_t a = rand32();
uint64_t b = rand32();
return (b << 32) + a;
}
bool randbool() { return rand32() & 1; }
uint64_t randbits(int bits)
{
if (bits == 0)
{
return 0;
}
else if (bits > 32)
{
return rand64() >> (64 - bits);
}
else
{
if (bitbuf_size < bits)
FillBitBuffer();
uint64_t ret = bitbuf & (~uint64_t(0) >> (64 - bits));
bitbuf >>= bits;
bitbuf_size -= bits;
return ret;
}
}
};
/**
* MWC RNG of George Marsaglia
* This is intended to be fast. It has a period of 2^59.3, though the
* least significant 16 bits only have a period of about 2^30.1.
*
* @return random value
*/
extern uint32_t insecure_rand_Rz;
extern uint32_t insecure_rand_Rw;
static inline uint32_t insecure_rand(void)
{
insecure_rand_Rz = 36969 * (insecure_rand_Rz & 65535) + (insecure_rand_Rz >> 16);
insecure_rand_Rw = 18000 * (insecure_rand_Rw & 65535) + (insecure_rand_Rw >> 16);
return (insecure_rand_Rw << 16) + insecure_rand_Rz;
}
#endif // BITCOIN_RANDOM_H