gpt4 book ai didi

c# - 使用 RNGCryptoServiceProvider 生成随机字符串

转载 作者:IT王子 更新时间:2023-10-29 04:46:45 25 4
gpt4 key购买 nike

我正在使用这段代码生成给定长度的随机字符串

public string RandomString(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}

但是,我了解到 RNGCryptoServiceProviderRandom 类更安全。我该如何实现此功能的 RNGCryptoServiceProvider。它应该像这个函数一样使用 valid 字符串。

最佳答案

由于 RNGRandomNumberGenerator 只返回字节数组,你必须这样做:

static string RandomString(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder res = new StringBuilder();
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
byte[] uintBuffer = new byte[sizeof(uint)];

while (length-- > 0)
{
rng.GetBytes(uintBuffer);
uint num = BitConverter.ToUInt32(uintBuffer, 0);
res.Append(valid[(int)(num % (uint)valid.Length)]);
}
}

return res.ToString();
}

但是请注意,这有一个缺陷,62 个有效字符等于 5,9541963103868752088061235991756 位 (log(62)/log(2)),因此它不会在 32 位数字 (uint) 上均分。

这有什么后果?结果,随机输出将不均匀。值较低的字符出现的可能性更大(只是一小部分,但它仍然会发生)。

更准确地说,有效数组的前 4 个字符出现的可能性高 0,00000144354999199840239435286 %。

为避免这种情况,您应该使用将平均分为 64 的数组长度(考虑在输出上使用 Convert.ToBase64String,因为您可以将 64 位完全匹配到 6 个字节。

关于c# - 使用 RNGCryptoServiceProvider 生成随机字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32932679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com