web-dev-qa-db-ja.com

C#でランダムに生成された16進数

C#を使用して、選択した長さのランダムな16進数を生成するにはどうすればよいですか?

28
shizbiz
static Random random = new Random();
public static string GetRandomHexNumber(int digits)
{
    byte[] buffer = new byte[digits / 2];
    random.NextBytes(buffer);
    string result = String.Concat(buffer.Select(x => x.ToString("X2")).ToArray());
    if (digits % 2 == 0)
        return result;
    return result + random.Next(16).ToString("X");
}
42
Mehrdad Afshari
    Random random = new Random();
    int num = random.Next();
    string hexString = num.ToString("X");

random.Next()は、最小値と最大値を指定できる引数を取ります。これにより、長さを制御できます。

18
womp

必要なランダム度によって異なりますが、3つの選択肢があります。1)通常はGuid.NewGuidを使用して、その一部を選択します(必要な数に応じて)。

2)System.Random(他の返信を参照)は、「十分にランダム」にしたい場合に適しています。

3)System.Security.Cryptography.RNGCryptoServiceProvider

4
KristoferA

256ビットの16進文字列(8x8 = 256)を返すものは次のとおりです。

private static string RandomHexString()
{
    // 64 character precision or 256-bits
    Random rdm = new Random();
    string hexValue = string.Empty;
    int num;

    for (int i = 0; i < 8; i++)
    {
        num = rdm.Next(0, int.MaxValue);
        hexValue += num.ToString("X8");
    }

    return hexValue;
}
2
Vippy

.... LINQを使用

private static readonly Random _RND = new Random();

public static string GenerateHexString(int digits) {
    return string.Concat(Enumerable.Range(0, digits).Select(_ => _RND.Next(16).ToString("X")));
}
1
Rüdiger

N文字(〜n/2バイト)の16進数のランダムな文字列を作成します。

var randBytes = new byte[n/2 + n%2>0?1:0];
new Random().NextBytes(randBytes);
var hex = BitConverter.ToString(randBytes).Replace("-", string.Empty).Substring(0,n);

Base64文字列を検討しましたか?アプリケーションによっては、多くの場合、より便利になります。それらはASCIIであり、入力バイトごとに最大4/3文字を提供することが保証されています。n文字の文字列を作成するには:

var randBytes = new byte[(n/4 + n%4>0?1:0)*3];
new Random().NextBytes(randBytes);
var base64 = Convert.ToBase64String(randBytes).Substring(0,n);

明らかに、アプリケーションが奇数の16進文字または4文字の倍数ではないBase64を必要としない場合は、.Substring(0、n)を省略できます。

他の投稿者が示唆しているように、Random()を静的にすることで、例を自由に拡張してください。

0
auser8y

暗号的に安全にしたい場合は、RNGCryptoServiceProviderを使用する必要があります。

public static string BuildSecureHexString(int hexCharacters)
{
    var byteArray = new byte[(int)Math.Ceiling(hexCharacters / 2.0)];
    using (var rng = new RNGCryptoServiceProvider())
    {
        rng.GetBytes(byteArray);
    }
    return String.Concat(Array.ConvertAll(byteArray, x => x.ToString("X2")));
}
0
dave