mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-07-09 18:00:13 +02:00
[move] Move PoissonNextSend to src/random and update comment
PoissonNextSend is used by net and net_processing and is stateless, so place it in the utility random.cpp translation unit.
This commit is contained in:
committed by
Martin Zumsande
parent
801aaac2b3
commit
9e64d69bf7
@ -3069,12 +3069,6 @@ std::chrono::microseconds CConnman::PoissonNextSendInbound(std::chrono::microsec
|
|||||||
return m_next_send_inv_to_incoming;
|
return m_next_send_inv_to_incoming;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval)
|
|
||||||
{
|
|
||||||
double unscaled = -log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */);
|
|
||||||
return now + std::chrono::duration_cast<std::chrono::microseconds>(unscaled * average_interval + 0.5us);
|
|
||||||
}
|
|
||||||
|
|
||||||
CSipHasher CConnman::GetDeterministicRandomizer(uint64_t id) const
|
CSipHasher CConnman::GetDeterministicRandomizer(uint64_t id) const
|
||||||
{
|
{
|
||||||
return CSipHasher(nSeed0, nSeed1).Write(id);
|
return CSipHasher(nSeed0, nSeed1).Write(id);
|
||||||
|
@ -1270,9 +1270,6 @@ private:
|
|||||||
friend struct ConnmanTestMsg;
|
friend struct ConnmanTestMsg;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Return a timestamp in the future (in microseconds) for exponentially distributed events. */
|
|
||||||
std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval);
|
|
||||||
|
|
||||||
/** Dump binary message to file, with timestamp */
|
/** Dump binary message to file, with timestamp */
|
||||||
void CaptureMessage(const CAddress& addr, const std::string& msg_type, const Span<const unsigned char>& data, bool is_incoming);
|
void CaptureMessage(const CAddress& addr, const std::string& msg_type, const Span<const unsigned char>& data, bool is_incoming);
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sync.h> // for Mutex
|
#include <sync.h> // for Mutex
|
||||||
#include <util/time.h> // for GetTimeMicros()
|
#include <util/time.h> // for GetTimeMicros()
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
@ -714,3 +715,9 @@ void RandomInit()
|
|||||||
|
|
||||||
ReportHardwareRand();
|
ReportHardwareRand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval)
|
||||||
|
{
|
||||||
|
double unscaled = -log1p(GetRand(1ULL << 48) * -0.0000000000000035527136788 /* -1/2^48 */);
|
||||||
|
return now + std::chrono::duration_cast<std::chrono::microseconds>(unscaled * average_interval + 0.5us);
|
||||||
|
}
|
||||||
|
14
src/random.h
14
src/random.h
@ -10,7 +10,7 @@
|
|||||||
#include <crypto/common.h>
|
#include <crypto/common.h>
|
||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
|
|
||||||
#include <chrono> // For std::chrono::microseconds
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
@ -82,6 +82,18 @@ D GetRandomDuration(typename std::common_type<D>::type max) noexcept
|
|||||||
};
|
};
|
||||||
constexpr auto GetRandMicros = GetRandomDuration<std::chrono::microseconds>;
|
constexpr auto GetRandMicros = GetRandomDuration<std::chrono::microseconds>;
|
||||||
constexpr auto GetRandMillis = GetRandomDuration<std::chrono::milliseconds>;
|
constexpr auto GetRandMillis = GetRandomDuration<std::chrono::milliseconds>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a timestamp in the future sampled from an exponential distribution
|
||||||
|
* (https://en.wikipedia.org/wiki/Exponential_distribution). This distribution
|
||||||
|
* is memoryless and should be used for repeated network events (e.g. sending a
|
||||||
|
* certain type of message) to minimize leaking information to observers.
|
||||||
|
*
|
||||||
|
* The probability of an event occuring before time x is 1 - e^-(x/a) where a
|
||||||
|
* is the average interval between events.
|
||||||
|
* */
|
||||||
|
std::chrono::microseconds PoissonNextSend(std::chrono::microseconds now, std::chrono::seconds average_interval);
|
||||||
|
|
||||||
int GetRandInt(int nMax) noexcept;
|
int GetRandInt(int nMax) noexcept;
|
||||||
uint256 GetRandHash() noexcept;
|
uint256 GetRandHash() noexcept;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user