C++ で Bittorrent クライアントを作成しており、20 バイトのピア ID を生成する必要があります。最初の 8 文字は-WW1000-
、クライアントの名前とバージョン番号を表します。残りの 12 桁は乱数である必要があり、クライアントが起動するたびにランダムに生成される必要があります。
12 桁の乱数を生成しstd::string
、最初の 8 文字を含む ( -WW1000-
) と連結するにはどうすればよいですか?
const string CurrentClientID = "-WW1000-";
ostringstream os;
for (int i = 0; i < 12; ++i)
{
int digit = rand() % 10;
os << digit;
}
string result = CurrentClientID + os.str();
1 つのアプローチは、N 回を使用して大きな文字列を作成することですrand()
。ここで、N は必要な桁数の長さです (モジュロ バイアスを回避する単純な方法です)。
size_t length = 20;
std::ostringstream o;
o << "-WW1000-";
for (size_t ii = 8; ii < length; ++ii)
{
o << rand(); // each time you'll get at least 1 digit
}
std::string id = o.str().substr(0, length);
そして、十分に新しい C++ コンパイラ/ライブラリを持っている場合:
// #include <random>
std::random_device r;
std::mt19937 gen(r());
std::uniform_int_distribution<long long> idgen(0LL, 999999999999LL);
std::ostringstream o;
o << "-WW1000-";
o.fill('0');
o.width(12);
o << idgen(gen);
std::string id = o.str();
あなたのIDがどの程度「安全」でなければならないかはわかりませんが、あなたが言ったからです:
that need to be generated randomly every time the client starts
、
おそらく、その情報 (1970 年 1 月 1 日より後の秒数の 10 桁) を使用して、別の 2 つのランダムな数字 (00..99) を追加することができます。
using namespace std;
...
...
ostringstream id;
id << "-WW1000-" << setw(10) << setfill('0') << time(0) << setw(2) << rand()%100;
...
私のシステムでは、これは現時点で次のように出力されます。
cout << id.str() << endl;
-WW1000-134306070741
要件がより厳しい場合は、もちろん、完全ランダム ベースのバリアントを使用する必要があります。