如果我们将我下面的方法与RCIX在这个答案中提出的方法进行比较,哪一个更有效率,为什么?
private string RandomString(int length = 25)
{
const string chars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789#@%&";
StringBuilder sbSalt = new StringBuilder();
for (int i = 0; i < length; i++)
{
int inx = 0;
inx = rnd.Next(0, chars.Length);
sbSalt.Append(chars[inx]);
}
return sbSalt.ToString();
}
private Random rnd = new Random();
我之所以使用"aAbBcC..."而不是"abc...ABC...",是为了增加每个字母的大小写之间随机化的概率,因为它们相邻。
此外,对于密码盐,最好保留重复字符还是确保每个字符在盐中只出现一次?然而,如果允许重复字符,则可以生成更多的盐组合。
提前致谢!
更新#1:
我意识到如果再次调用RandomString函数,它将返回完全相同的随机字符串,所以为了解决这个问题,我通过将rnd声明为新的Random仅一次并将其移动到函数外部来进行修复。
.Next()
函数返回相同的数字集合。如果未将种子插入到Random
构造函数中,则它将使用基于DateTime.Now的值。 - StefanRandom
对象。这将始终基于当前时间创建一个新实例。如果您多次实例化该类,则有可能创建相同的种子。最好为特定目的创建一个Random
对象,并在整个应用程序的生命周期中使用它以确保正确的分布(当然,在重复周期内)。 - Caramiriel