在C#中随机生成的十六进制数

shi*_*biz 28 c# random hex

如何使用C#生成具有我选择长度的随机十六进制数字?

Meh*_*ari 43

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");
}
Run Code Online (Sandbox Code Playgroud)


wom*_*omp 19

    Random random = new Random();
    int num = random.Next();
    string hexString = num.ToString("X");
Run Code Online (Sandbox Code Playgroud)

random.Next()接受允许您指定最小值和最大值的参数,这样就可以控制长度.


Kri*_*erA 8

取决于您想要它的随机程度,但这里有 3 种选择:1)我通常只使用 Guid.NewGuid 并选择其中的一部分(取决于我想要的数量)。

2)System.Random(见其他回复)如果你只是想要“足够随机”就很好。

3) System.Security.Cryptography.RNGCryptoServiceProvider

  • 是的。请参阅位于 http://msdn.microsoft.com/en-us/library/system.random.aspx 的 System.Random 文档 (3认同)
  • 对我来说,分割 GUID 似乎是一个非常糟糕的主意。它们只是整体上独一无二的。GUID 的许多位当然不符合随机条件。 (2认同)

gro*_*lex 5

我需要类似于 Pythonsecrets.token_hex函数的东西。

如果您需要加密安全的随机字节,您可以RNGCryptoServiceProviderSystem.Security.Cryptography命名空间中使用,如下所示:

using var csprng = new RNGCryptoServiceProvider();
var bytes = new byte[16];

csprng.GetNonZeroBytes(bytes); // or csprng.GetBytes(…)
Run Code Online (Sandbox Code Playgroud)

要将字节数组转换为十六进制字符串,使用 LINQ 似乎是最易读的选项:

string.Join("", bytes.Select(b => b.ToString("x2"))); // or "X2" for upper case
Run Code Online (Sandbox Code Playgroud)

输出可能如下所示:

7fb70c709a5eed32d37ed5771f09c0fe
Run Code Online (Sandbox Code Playgroud)